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

C、 指针数组:int n[5],int*p[5],赋值p[i]=&n[i],为什么*p与p相同?,c,arrays,pointers,C,Arrays,Pointers,对不起,我误读了我的结果,*p和p是不同的 我正在努力理解指针数组 我写 int n[5] = {1,2,3,4,5}; int *p[5]; for(i = 0; i < 5; i++){ p[i] = &n[i]; } 给我数组中第一个指针的地址 困扰我的是p,只有p,没有星号,没有括号 因为 printf("%0x\n", *p); printf("%0x\n", p); 给我完全一样的东西。 为什么p也是数组中第一个指针的地址???]错误,对不起 当声明像上面这

对不起,我误读了我的结果,*p和p是不同的

我正在努力理解指针数组

我写

int n[5] = {1,2,3,4,5};
int *p[5];
for(i = 0; i < 5; i++){
    p[i] = &n[i];
}
给我数组中第一个指针的地址

困扰我的是p,只有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]??
    }
}
既然argv被声明为指针数组,那么argv[i]不应该产生地址而不是它所指向的字符串吗?因为它前面没有星号

提前感谢。

当您仅使用p时,它会衰减为指向数组p中第一个元素的指针,即p相当于&p[0]

当您取消引用该指针时,将得到存储在p[0]中的指针。也就是说,当你做*p时,它和做*&p[0]一样,操作符的解引用和地址相互去掉,只给你p[0],在你的例子中,这等于&n[0]

还请注意,当您要使用打印指针时,应该使用%p格式,并真正将void*作为参数传递

不相关的问题是因为argv是一个指向字符的指针数组。对于任何有效的索引i,表达式argv[i]为您提供一个char*类型的指针。如果取消引用此指针,则会得到argv[i]指向的字符,即单个字符。

仅使用p时,它会衰减为指向数组p中第一个元素的指针,即p相当于&p[0]

当您取消引用该指针时,将得到存储在p[0]中的指针。也就是说,当你做*p时,它和做*&p[0]一样,操作符的解引用和地址相互去掉,只给你p[0],在你的例子中,这等于&n[0]

还请注意,当您要使用打印指针时,应该使用%p格式,并真正将void*作为参数传递

不相关的问题是因为argv是一个指向字符的指针数组。对于任何有效的索引i,表达式argv[i]为您提供一个char*类型的指针。如果取消引用此指针,则会得到argv[i]所指向的字符,即单个字符。

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];
}
现在,p,只是p,没有星号,没有括号会给出值200,这是数组p[]的第一个元素的地址

就像智者n会给出100的值一样

*p将给出值100,该值是存储在数组p[]的第一个位置的元素。

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];
}
现在,p,只是p,没有星号,没有括号会给出值200,这是数组p[]的第一个元素的地址

就像智者n会给出100的值一样

*p将给出值100,该值是存储在数组p[]第一个位置的元素。

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);
在我的桌面上

如果我使用:

printf("%0x\n", *p);
printf("%0x\n", p);
当使用gcc-Wall编译时,我得到以下警告

即使如此,我还是得到了以下输出:

3ef18920
3ef18940
正如你所看到的,它们是不同的

可能是由于使用了不正确的格式说明符,您看到了未定义行为的症状

请参见。

给出的两种表格的输出

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);
在我的桌面上

如果我使用:

printf("%0x\n", *p);
printf("%0x\n", p);
当使用gcc-Wall编译时,我得到以下警告

即使如此,我还是得到了以下输出:

3ef18920
3ef18940
正如你所看到的,它们是不同的

可能是由于使用了不正确的格式说明符,您看到了未定义行为的症状


请参阅。

上两种形式的输出。我无法重现该问题*p和p在我的情况下是不同的。该死,你是对的,我搞错了!!有一点不同,我错过了!我无法重现这个问题*p和p在我的情况下是不同的。该死,你是对的,我搞错了!!有一点不同,我错过了!那很有帮助!!tks!!那很有帮助!!tks!!