int指针是一个int数组吗?

时间:2013-06-21 17:04:02

标签: c

我一直在关注一些声明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数组而不是一个指向int的指针?

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

5 个答案:

答案 0 :(得分:10)

  

int指针是一个int数组吗?

没有

  

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

没错。 Pointers are pointers, arrays are arrays.

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

ptr[i]

等同于

*(ptr + i)

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

这种强关系的结果是,在某些情况(以及某些约束)中,数组和指针可以使用它们是可以互换的。这仍然不意味着它们是相同的,但它们具有足够的共同属性,因此它们的用法通常看起来“相同”。

答案 1 :(得分: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];不要那样做!

答案 2 :(得分:1)

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

总的来说,这是真的:

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

因此,您可以使用int指针访问该数组。请注意注意'\0'字符并停止。

答案 3 :(得分:1)

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

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

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

请注意,如果您尝试在阵列中直接分配太大的内存块,编译器会抱怨。

<强>阵列

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

<强>指针:

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

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

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

如果你做“数组+ 1”,结果地址将是数组[0] + 40的地址。如果你做“指针+ 1”,结果地址将是指针[0] + 4的地址。

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

进行动态分配

当您执行以下赋值时,它实际上是整数数组到整数指针的隐式类型转换。

pointer = array;