-1

我有这个数组,我试图通过递增 ptr 来访问它的元素,如此处所建议的尝试找到访问数组元素的不同方法?...我一定是在做一些愚蠢的事情...请帮助我!

#include <stdio.h>
#include <stdlib.h>


int main()
{
   int i;

   char *p1 = "Cnversions";  
   char *p2 = "Divided";  
   char *p3 = "Plain";  
   char *p4 = "Solid";  

   char *arr[3];

   arr[0] = p1;
   arr[1] = p2;
   arr[2] = p3;
   arr[3] = p4;



   for(i=0;i<=3;i++)
   {

      printf("string at arr[%d] is: %s\n",i,*arr);

     arr++;
    }

   return 0;

  }
4

2 回答 2

5

像这样的数组arr位于内存中的特定位置,因此递增没有意义arr(递增数组意味着什么?)

相反,您需要创建一个指向数组开头的指针并递增指针:

char **ptr = arr;
for(i=0; i<4; i++) {
    printf("arr[%d] = %s\n", i, *ptr);
    ptr++;
}

(另请注意,您需要使arr四个元素变大,即char *arr[4],以容纳您放入其中的四个字符串指针。)

于 2013-02-27T07:52:03.553 回答
-1

请记住,尽管我们倾向于将双指针视为数组,但所有编译器都将它们视为指针。当您增加一个指针时,它会向指针的地址添加一个值,该值等于它指向的数据类型的大小。例如:

int *p;
p = (int *) malloc(sizeof(int));

p指向 a int,因此 的p指向数据的大小(通常)为 4 个字节。这意味着当您增加 时p,它将指向比以前大 4 个字节的位置。

的类型arr是 a char**,这意味着它是指向 a 的指针的指针char。现在大多数机器上的指针都是 8 个字节。因此,当您增加 时arr,您实际上是在告诉计算机设置arr为指向比以前高 8 个字节的地址。在 的情况下arr,这是一个非法地址,因此您会遇到某种崩溃。

于 2013-02-27T08:24:17.933 回答