int指针是一个int数组吗?

use*_*073 4 c

我一直在关注一些声明int指针的例子

int *myInt;
Run Code Online (Sandbox Code Playgroud)

然后将该指针转换为数组

myInt = (int*)malloc(1024);
Run Code Online (Sandbox Code Playgroud)

这检查出来

myInt[0] = 5; 
cout << myInt[0]; // prints 5
myInt[1] = 7;
cout << myInt[1]; // prints 7
Run Code Online (Sandbox Code Playgroud)

我认为一个int指针是指向int的指针,而不是其他任何指针.我知道指向字符串的指针只是指向字符串的第一个字符,但它看起来像是在使用一组int的同类事件.但是,如果我们想要的是一个int数组,为什么不只是创建一个int数组而不是指向int的指针?

顺便说一下,我对它在C而不是C++中是如何工作感兴趣.这是在C++文件中,但相关代码在C中.

小智 10

int指针是一个int数组吗?

没有.

我认为一个int指针是指向int的指针,而不是其他任何指针

那就对了.指针是指针,数组是数组.

令你困惑的是,指针可以指向数组的第一个元素,而数组可以衰减成指向第一个元素的指针.而且更令人困惑的是:指针具有数组用于索引的解引用和指针算法相同的语法.也就是说,

ptr[i]
Run Code Online (Sandbox Code Playgroud)

相当于

*(ptr + i)
Run Code Online (Sandbox Code Playgroud)

if ptr是指针.当然,类似地,arr[i]也是数组的i第th个元素arr.相似性产生于指针和数组的共同特性:它们都用于间接访问(可能是块)内存.

这种强关系的结果是在某些情况下(并且有一些约束),可以使用数组和指针,就好像它们是可互换的一样.这仍然不意味着它们是相同的,但它们具有足够的共同属性,因此它们的使用通常看起来"相同".


das*_*ght 3

有一种替代语法可以访问指针所指向的项 - 方括号。这种语法允许您通过指针访问数据,就好像指针是数组一样(当然,指针不是数组)。表达式a[i]只是*(a+i)*的另一种书写形式。

当您分配动态存储并将其分配给 时myInt,您可以像使用可以在运行时更改大小的动态数组一样使用指针:

myInt = malloc(1024*sizeof(int)); // You do not need a cast in C, only in C++
for (int i = 0 ; i != 1024 ; i++) {
    myInt[i] = i; // Use square bracket syntax
}
for (int i = 0 ; i != 1024 ; i++) {
    printf("%d ", *(myInt+i)); // Use the equivalent pointer syntax
}
Run Code Online (Sandbox Code Playgroud)


*顺便说一句, 的交换性+让你可以4[array]写成array[4]; 不要那样做!