请告诉我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
还给我一些链接,我可以在那里找到类似的练习题。
答案 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]);