带有数组的指针

时间:2018-06-16 12:35:54

标签: c arrays pointers

代码1:

#include<stdio.h>
int main(void)
{
    int* arr[5];
    for(int i=0; i<5; i++) {
        arr[i] = (int*)malloc(sizeof(int));
        *arr[i] = i;
    }
    printf("%d",arr[3]);
    return 0;
}

输出:

13509232

代码2:

#include<stdio.h>
int main(void)
{
    int* arr[5];
    for(int i=0; i<5; i++) {
        arr[i] = (int*)malloc(sizeof(int));
        *arr[i] = i;
    }
    printf("%d",arr[3][0]);
    return 0;
}

输出:

3

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

我无法得到它,因为在第一个地方,arr [3]是1D数组,arr [3] [0]是2D数组。毕竟,arr [3]是一个地址,而arr [3] [0]是存储在地址arr [3]中的值。我可以用这种方式摆脱*运算符吗?请简单解释一下。

提前致谢。

编辑1:我们采取最简单的情况,单变量。

#include<stdio.h>
int main(void)
{
    int k=5;
    int *ptr=&k;
    printf("%d",ptr[0]);
    return 0;
}

输出:

5

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

%d期望值本身,而不是指向它的指针。 arr[3]是指针,是指针数组中的第4个指针。 arr[3][0]是实际数字。您也可以在循环中编写*arr[3],然后实际执行。

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

底线:就int - s而言,你有一个二维数组,而不是一个紧凑的n*m - 风格的数组,但有一个经常被称为锯齿状(https://en.wikipedia.org/wiki/Jagged_array )。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用[0]进行推理有一个简单的解释(尽管我不推荐它)。看到这个小代码:

int i;
int j[1];

这两个有什么区别?显然一个是大小为1的数组,但如果你考虑一下,大小为1的数组在某种程度上等于定义该类型一次。

取消引用*在某种程度上等于使用数组索引进行访问。但是因为数据看起来像一个包含1个元素的数组,所以可以使用[0]访问它。

答案 4 :(得分:-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;
}

示例输入:

观察次数:4

12.12

34.14

43.1

45.87

示例输出:

平均值= 33.81