抱歉,我误解了我的结果,* p和p不同
我正在尝试理解指针数组。
我写了
printf("%0x\n", *p);
到目前为止一切顺利。
我理解
printf("%0x\n", *p);
printf("%0x\n", p);
给出了数组中第一个指针的地址。
令我不安的是 p ,只是p,没有星号,没有括号。
因为
int main(int argc, char *argv[]){
for(int i = 0; i < argc; i++){
printf("%s\n",argv[i]); //why not *argv[i]??
}
}
[给我完全相同的东西。 为什么p也是数组中第一个指针的地址??] 错误,SORRY!
当声明如上所述的指针数组时,p究竟是什么意思?
相关问题
argv
因为argv[i]
被声明为一个指针数组,所以Write-Output
不应该产生地址而不是它所指向的字符串?因为它前面没有星号。
提前致谢。
答案 0 :(得分:4)
p,只是p,没有星号,没有括号给出数组p[]
的第一个元素的地址。另一方面,*p
给出数组p[]
的第一个元素的值,它恰好是数组n[]
的第一个元素的地址,根据您显示的代码
让我们举一个例子,假设一个整数大小为4个字节,一个大小为8字节的地址,以及你展示的第一个程序。
int n[5] = {1,2,3,4,5};
int *p[5];
for(i = 0; i < 5; i++)
{
p[i] = &n[i];
}
数组看起来像这样..(假设地址用于解释目的,它们不是真的。)
n[] = { 1, 2, 3, 4, 5}; //these are integers
// ^ ^ ^ ^ ^
// 100 104 108 112 116 these are the addresses of the elements of array n[]
p[] = { 100, 104, 108, 112, 116}; // these are pointer to integers
// ^ ^ ^ ^ ^
// 200 208 216 224 232 these are adddress of the elements of array p[]
现在, p,只是p,没有星号,没有括号会给出值200
,这是数组p[]
的第一个元素的地址。
同样聪明的n
会给出值100
。
*p
会给出值100
,这是存储在数组p[]
的第一个位置的元素。
答案 1 :(得分:1)
当你只使用p
时,它会衰减到指向数组p
中第一个元素的指针,即p
相当于&p[0]
。
当您取消引用该指针时,您将指针存储在p[0]
中。即当你执行*p
时,它与执行*&p[0]
的操作相同,并且操作符的取消引用和地址会相互取出,只提供p[0]
,在您的情况下等于&n[0]
。
另请注意,当您想使用printf
打印指针时,您应该使用格式"%p"
(并且确实传递void *
作为参数。)
不是真正相关的问题是因为argv
是一个指向字符的指针数组。对于任何有效索引i
,表达式argv[i]
会为您提供类型为char *
的指针。如果取消引用此指针,则会得到argv[i]
指向的字符,即单个字符。
答案 2 :(得分:1)
鉴于,
int n[5] = {1,2,3,4,5};
int *p[5];
for(int i = 0; i < 5; i++){
p[i] = &n[i];
}
printf("0x%p\n", *p);
printf("0x%p\n", p);
预计输出绝对不会相同。
我得到了
0x0x7fffe0c40b40
0x0x7fffe0c40b60
在我的桌面上。
如果我使用:
printf("%0x\n", *p);
printf("%0x\n", p);
使用gcc -Wall
soc.c: In function ‘test’:
soc.c:12:4: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("%0x\n", *p);
^
soc.c:13:4: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int **’ [-Wformat=]
printf("%0x\n", p);
即使这样,我得到以下输出:
3ef18920
3ef18940
如你所见,它们不一样。
由于使用了不正确的格式说明符,您可能会看到未定义行为的症状。
在http://ideone.com/73UoDa查看两种表单的输出。