C语言中带数组的指针

C语言中带数组的指针,c,arrays,pointers,C,Arrays,Pointers,代码1: 代码2: 13509232 我已经声明了一个指针数组。我可以简单地编写arr[3][0]来解引用它,而不是使用*arr[3]来解引用存储的值。它适用于阵列的所有维度。只需在其维度上添加一个额外的零,即可解除对存储在该位置的值的引用 我无法获取它,因为首先,arr[3]是1D数组,而arr[3][0]是2D数组。毕竟,arr[3]是一个地址,而arr[3][0]是存储在地址arr[3]的值。我能用这种方法摆脱*操作符吗?请简单解释一下 提前谢谢 编辑1:让我们看一个最简单的例子,单变量

代码1:

代码2:

13509232
我已经声明了一个指针数组。我可以简单地编写arr[3][0]来解引用它,而不是使用*arr[3]来解引用存储的值。它适用于阵列的所有维度。只需在其维度上添加一个额外的零,即可解除对存储在该位置的值的引用

我无法获取它,因为首先,arr[3]是1D数组,而arr[3][0]是2D数组。毕竟,arr[3]是一个地址,而arr[3][0]是存储在地址arr[3]的值。我能用这种方法摆脱*操作符吗?请简单解释一下

提前谢谢

编辑1:让我们看一个最简单的例子,单变量

3

由于为这两种情况计算的地址相同,因此可以使用它们arr[3][0]。 假设arr[3]的地址为1000。
arr[3][0]的子地址将为1000+0*sizeof(int),即1000

,因为为这两种情况计算的地址将是相同的,因此可以使用它们arr[3][0]。 假设arr[3]的地址为1000。
arr[3][0]的子地址将为1000+0*sizeof(int),即1000

ptr[x]
可以写成
*(ptr+x)
。因此,
ptr[0]
转换为
*(ptr+0)
,即
*ptr

ptr[x]
可以写成
*(ptr+x)
。因此,
ptr[0]
转换为
*(ptr+0)
,即
*ptr

%d
需要值本身,而不是指向它的指针
arr[3]
是指针,是指针数组中的第四个指针
arr[3][0]
是实际数字。您也可以在循环中编写
*arr[3]
,实际上就是这样

指针的行为类似于数组,将内存分配给
int*a
后,可以将值存储到指向的位置,即
*a=123
a[0]=123
。另外,如果为2个整数分配内存,则可以作为
a[1]
(更简单)访问第二项,也可以作为
*(a+1)


一句话:对于
int
-s,您有一个2D数组,只是不是一个紧凑的
n*m
-style数组,而是一个经常被称为锯齿状()的数组。

%d
需要值本身,而不是指向它的指针
arr[3]
是指针,是指针数组中的第四个指针
arr[3][0]
是实际数字。您也可以在循环中编写
*arr[3]
,实际上就是这样

指针的行为类似于数组,将内存分配给
int*a
后,可以将值存储到指向的位置,即
*a=123
a[0]=123
。另外,如果为2个整数分配内存,则可以作为
a[1]
(更简单)访问第二项,也可以作为
*(a+1)


一句话:就
int
-s而言,您有一个2D数组,只是不是一个紧凑的
n*m
-style数组,而是一个经常被称为锯齿状()的数组。

使用
[0]
可以很容易地理解为尊重(尽管我不推荐)。请参阅以下小代码:

5
这二者的区别是什么?显然,其中一个是大小为1的数组,但仔细想想,大小为1的数组在某种程度上等于定义了该类型一次


使用
*
解除引用在某种程度上等同于使用数组索引进行访问。但是,由于数据看起来像是一个包含1个元素的数组,因此您可以使用
[0]
来访问它。使用
[0]
来表示尊重(尽管我不推荐)。请参阅以下小代码:

5
这二者的区别是什么?显然,其中一个是大小为1的数组,但仔细想想,大小为1的数组在某种程度上等于定义了该类型一次


使用
*
解除引用在某种程度上等同于使用数组索引进行访问。但是,由于数据看起来像是一个包含1个元素的数组,因此您可以使用
[0]

访问它。请使用这种类型的代码。试着把你的代码改成这样, 希望这能对你有所帮助。 干杯

#包括
#包括
int main()
{
浮点数*p,tot=0;
inti,n;
printf(“观察次数:”);
scanf(“%d”和“&n”);
p=(浮动*)malloc(n*sizeof(浮动));
if(p==NULL)
{
printf(“未分配内存”);
出口(1);
}
对于(i=0;i
样本输入:

观察次数:4次

12.12

34.14

43.1

45.87

样本输出:


平均值=33.81

使用此类型的代码。试着把你的代码改成这样, 希望这能对你有所帮助。 干杯

#包括
#包括
int main()
{
浮点数*p,tot=0;
inti,n;
printf(“观察次数:”);
scanf(“%d”和“&n”);
p=(浮动*)malloc(n*sizeof(浮动));
if(p==NULL)
{
printf(“未分配内存”);
出口(1);
}
对于(i=0;i
样本输入:

观察次数:4次

12.12

34.14

43.1

45.87

样本输出:


Average=33.81

不要强制转换
malloc
的返回值。如果您忘记包含stdlib.h(顺便说一句,您确实包含了stdlib.h),它会隐藏错误代码试图打印的值是地址。不是整数。因此,在调用任何堆分配函数时,正确的格式说明符是“%p”而不是“%d”:
malloc
calloc
realloc
,如果代码试图打印指向数组项的值,则始终检查(!=NULL)返回值以确保操作成功,t
#include<stdio.h>
int main(void)
{
    int k=5;
    int *ptr=&k;
    printf("%d",ptr[0]);
    return 0;
}
5
int i;
int j[1];
#include<stdio.h>
#include<stdlib.h>

int main()
{
    float *p, tot = 0;
    int i, n;

    printf("Number of observations: ");
    scanf("%d", &n);

    p = (float*)malloc(n*sizeof(float));

    if(p==NULL)
    {
        printf("Memory is not allocated");
        exit(1); 
    }

    for(i = 0; i < n; i++)
    {
        scanf("%f", p+i);
    }


    for(i = 0; i < n; i++)
    {
        tot += *(p+i);
    }

    printf("\nAverage = %.2f\n", tot/n);


    return 0;
}