6

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

int *myInt;

然后将该指针转换为数组

myInt = (int*)malloc(1024);

这检查出来

myInt[0] = 5; 
cout << myInt[0]; // prints 5
myInt[1] = 7;
cout << myInt[1]; // prints 7

我认为一个 int 指针是一个指向 int 的指针,而不是其他任何东西。我知道指向字符串的指针只是指向字符串的第一个字符,但看起来同样的事情在这里发生了一个整数数组。但是,如果我们想要的是一个 int 数组,为什么不直接创建一个 int 数组而不是一个指向 int 的指针呢?

顺便说一句,我对它在 C 而不是 C++ 中的工作方式很感兴趣。这是在 C++ 文件中,但相关代码在 C 中。

4

5 回答 5

12

整数指针是整数数组吗?

不。

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

这是正确的。指针是指针,数组是数组。

让您感到困惑的是,指针可以指向数组的第一个元素,而数组可以衰减为指向其第一个元素的指针。更令人困惑的是:指针与数组用于索引的解引用和指针算法具有相同的语法。即,

ptr[i]

相当于

*(ptr + i)

ifptr是一个指针。当然,同样,arr[i]也是数组的i第 th 个元素。arr相似性源于指针和数组的共同性质:它们都用于间接访问(可能是块)内存。

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

于 2013-06-21T17:09:03.847 回答
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
}


*顺便说一下,交换律+让你可以写4[array]而不是array[4]; 不要那样做!

于 2013-06-21T17:06:18.643 回答
1

有点,技术上没有。int 指针确实指向 int。但是 int 数组在内存中是连续的,因此可以使用*(myInt+1). 数组表示法myInt[1]是等效的,因为它使用 myInt 指针,向它添加 1 个单位(一个 int 的大小),并引用该新地址。

所以总的来说,这是真的:

myInt[i] == *(myint + i)

因此,您可以使用 int 指针来访问数组。小心留意'\0'角色并停下来。

于 2013-06-21T17:08:55.637 回答
1

int 指针不是整数数组。但是您更大的问题似乎是为什么需要数组和指针。

数组表示数据在内存中的实际存储。一旦分配了存储空间,无论您是使用数组表示法还是指针表示法来引用存储的数据,都没有显着差异。

但是,也可以在不使用数组表示法的情况下分配此存储空间,这意味着不一定需要数组。数组的主要好处是小块内存的方便分配,即,比.int x[20]更方便的表示法。值得庆幸的是,无论是来自数组声明还是只是一个指针,都可以使用这种更方便的表示法。(本质上,一旦分配了一个数组,从该点开始,它的变量名与分配给指向数组中第一个值在内存中的位置的指针没有什么不同。)array[i]*(array+i)array

请注意,如果您尝试直接在数组中分配太大的内存块,编译器会报错。

数组:

  • 表示实际分配的内存
  • 数组的变量名与引用内存中数组开始点的指针相同(变量名 + 1 与引用内存中数组第二个元素开始的点的指针相同(如果存在)等)
  • 可以使用数组表示法访问数组中的值,例如array[i]

指针:

  • 是在内存中存储某物位置的地方
  • 可以引用数组中分配的内存
  • 或者可以引用由函数分配的内存,例如malloc
  • 指针指向的内存中存储的值可以通过取消引用指针来访问,即*pointer.
  • 由于数组的名称也是一个指针,所以数组中第一个元素的值可以通过 访问*array,第二个元素可以通过 *(array+1) 访问,等等。
  • 可以将整数添加或减去指针以创建一个新指针,该指针指向程序分配的同一内存块中的其他值。例如,array+5 指向内存中存储值 array[5] 的位置。
  • 指针可以递增或递减以指向具有相同内存块的其他值。

在许多情况下,一种符号会比另一种更方便,因此两种符号都可用并且很容易相互互换是非常有益的。

于 2013-06-21T17:48:40.753 回答
1

它们是不相同的。这是可见的差异。

int  array[10];
int  *pointer;

printf ("Size of array = %d\nSize of pointer = %d\n",
    sizeof (array), sizeof (pointer));

结果是,

Size of array = 40
Size of pointer = 4

如果您执行“array + 1”,则结果地址将是 array[0] + 40 的地址。如果您执行“pointer + 1”,则结果地址将是 pointer[0] + 4 的地址。

数组声明导致编译时内存分配。指针声明不会导致编译时内存分配,需要使用 calloc() 或 malloc() 进行动态分配

当您执行以下分配时,它实际上是将整数数组隐式类型转换为整数指针。

pointer = array; 
于 2013-06-22T03:14:19.537 回答