打印字符数组的地址

时间:2013-11-21 18:06:43

标签: c arrays string pointers

请告诉我char*arr[4]char *(*ptr)[4]=&arr(*ptr)[i]如何逐步表示。

#include<stdio.h>
int main()
{
int i;
char *arr[4]={"c","c++","java","vba"};
char *(*ptr)[4]=&arr;
for(i=0;i<4;i++)
       printf("address of string %d : %u\n",i+1,(*ptr)[i]);
return 0;
}

output:
address of string 1 : 178
address of string 2 : 180
address of string 3 : 184
address of string 4 : 189

如果我更改printf语句:

printf("string %d : %s\n",i+1,(*ptr)[i]);

output:
string 1 = c
string 2 = c++
string 3 = java
string 4 = vba

还给我一些链接,我可以在那里找到类似的练习题。

3 个答案:

答案 0 :(得分:0)

char *arr[4]是一个包含4个指针的数组。换句话说,它是4个字符串的数组。 char *(*ptr)[4]=&arr声明一个指向char的4个指针数组的指针。此行中的分配指定数组arr的第一个元素的地址; *(ptr)[i]取消引用ptr数组的第i个元素。

我刚刚在棘手的C指针声明上找到了quiz。你可以在那里练习。

答案 1 :(得分:-1)

这是未定义行为的一个很好的例子。为什么?

这背后的原因是对特定数据类型使用错误的说明符总是调用未定义的行为 *(ptr)[i]的类型为char *。使用说明符%u打印它是错误的 使用%p说明符打印指针数据类型。

 printf("address of string %d : %p\n",i+1,(void *)*(ptr)[i]);

答案 2 :(得分:-1)

*(ptr)[i]

应该是

(*ptr)[i]

并且:使用%p打印void *指针,因此打印行应如下所示:

printf("address of string %d : %p\n", i+1, (void *)(*ptr)[i]);