对不起,我看错了我的结果,*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]不应该生成地址而不是它所指向的字符串吗?因为它前面没有星号。
提前谢谢。
发布于 2016-02-18 05:51:14
p,只有p,没有星号,没有括号给出数组p[]的第一个元素的地址。另一方面,根据您显示的代码,*p给出了数组p[]的第一个元素的值,这恰好是数组n[]的第一个元素的地址。
让我们以一个例子为例,假设整数大小为4字节,地址if为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[]的第一个元素的地址。
像wise一样,n会给出100的值。
*p将给出值100,它是存储在数组p[]的第一个位置的元素。
发布于 2016-02-18 05:51:09
当您只使用p时,它会衰减到指向数组p中的第一个元素的指针,也就是说,p等同于&p[0]。
当您取消引用该指针时,您将得到存储在p[0]中的指针。也就是说,当您执行*p时,这与执行*&p[0]是一样的,运算符的取消引用和地址--每个操作符的删除和地址--只给出了p[0],在您的情况下,这等于&n[0]。
还请注意,当您想要使用printf打印指针时,您应该使用"%p"格式(并真正传递void *作为参数)。
不相关的问题是,因为argv是指向字符的指针数组。对于任何有效的索引i,表达式argv[i]为您提供一个char *类型的指针。如果取消引用这个指针,就会得到argv[i]指向的字符,即单个字符。
发布于 2016-02-18 05:57:54
给予,
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中这两种表单的输出。
https://stackoverflow.com/questions/35473789
复制相似问题