C,指针数组:int n [5],int * p [5],赋值p [i] =& n [i],为什么* p与p相同?

时间:2016-02-18 05:47:05

标签: c arrays pointers

抱歉,我误解了我的结果,* 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不应该产生地址而不是它所指向的字符串?因为它前面没有星号。

提前致谢。

3 个答案:

答案 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查看两种表单的输出。