打印字符数组的地址

4
请告诉我char*arr[4]char *(*ptr)[4]=&arr(*ptr)[i]在这里逐步表示什么意思。
请逐步说明以下几点: 1. char* arr[4] 表示一个指向字符型数据的指针数组,该数组有4个元素。 2. char *(*ptr)[4]=&arr 表示一个指向指针数组(即上面提到的arr)的指针。 3. (*ptr)[i] 表示指针指向的数组中第 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

同时请给我一些链接,让我可以找到类似的问题进行练习。

我怀疑你问题中的第二个输出并不是指 printf("string %d : %s\n",i+1,*(ptr)[i]);。更有可能它是由 printf("string %d : %s\n",i,(*ptr)[i]); 产生的结果。 - alk
1
@alk; 同意。printf("string %d : %s\n",i+1,*(ptr)[i]); 会给出一些垃圾值。但是由于行为未定义,他可能会得到这个结果!! - haccks
3个回答

0

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

我刚在quiz上找到了一个关于C指针声明的棘手问题测验。你可以在那里进行练习。


1
"*char *(ptr)[4]=&arr 声明了一个指向包含4个字符串指针的数组的指针"。不,它声明了一个指向这样数组的指针。 - alk
1
@alk 确实。感谢您注意到错误!我已经更新了答案。 - Igor Popov
这不是一个包含四个字符串的数组,而是包含四个指向这种类型的指针的数组。 - alk
@alk char *(*ptr)[4] 声明 ptr 为指向包含4个指向 char 的指针的数组的指针。 - haccks
@alk; 不一定所有的4个字符指针都是在内存中线性排列的。 - haccks
显示剩余4条评论

-1

这个

*(ptr)[i]

应该是

(*ptr)[i]

另外:使用%p来打印void *指针,因此打印行应该如下所示:

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

问题不是纠正OP的代码,而是解释“char * arr [4],char * (* ptr) [4] =&arr和*(ptr)[i]”逐步表示什么。 - Igor Popov
1
@IgorPopov;如果您已经对这个回答进行了反对,那我建议您不要这样做。这不是正确的方式。问题对我们来说不够清晰明了。 - haccks

-1

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

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

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

还是错的... - ptr 是一个指向数组的指针。因此,要访问数组的元素,首先ptr 进行解引用。后者是“奇怪”行为的原因。 - alk
当然这是一个指针,但不是原帖作者所期望的那个。可以这样说:你展示的代码不会产生预期的输出。 - alk
传递一个 char* 以打印 "%s" 是完全有效的。 - alk
还有,循环遍历*(ptr)[i]会对4个包含4个char的数组进行循环(i= 0; i<4; ++i),而不是恰好一个数组中的4个char元素。 - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接