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

标签 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];
}

到目前为止还不错。

我明白了

printf("%0x\n", *p);

给我数组中第一个指针的地址。


让我困扰的是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则给出数组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[] 的第一个位置的元素。

关于C、指针数组: int n[5], int *p[5],赋值p[i] = &n[i],为什么*p和p一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35473789/

相关文章:

c - 变量指针与内存指针

与结构的混淆以及如何在 C 中使用指针存储值

arrays - 组合公共(public)前缀子串

c# - 与索引比较查找数组中的值

php - 使用 mysql 或 php 将 `group` 与 `tags` 分组/格式化

c - 为什么这个 C 指针的引用值成为它的内存地址

用2个函数计算

c - 何时一起编译文件以及何时使用库

c - "watches"调试工具上的错误值

c - 如何正确匹配.c和.h?