我一直在关注一些声明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.相似性产生于指针和数组的共同特性:它们都用于间接访问(可能是块)内存.
这种强关系的结果是在某些情况下(并且有一些约束),可以使用数组和指针,就好像它们是可互换的一样.这仍然不意味着它们是相同的,但它们具有足够的共同属性,因此它们的使用通常看起来"相同".
有一种替代语法可以访问指针所指向的项 - 方括号。这种语法允许您通过指针访问数据,就好像指针是数组一样(当然,指针不是数组)。表达式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]; 不要那样做!