我对指针操作有疑问...
main()
{ int x=10; // extra line added...
char *p=x;
printf("%d", &p)
printf("%d", &p[0]);
printf("%d" , &p[1]);
}
此代码给出输出
地址 10.. 10 11
最后两个输出是怎么来的..谁能给我解释一下..?
代码变了……
这是未定义的行为。
在将某个值添加到该位置之前,指针需要指向有效的东西。
char a = 10;
char *p = &a;
将解释两种情况:
char * p = x;
x == 10
,p
是一个 char 指针,初始化为 10(用户程序无法访问的地址):p == 10
p
(ie, )的值*p
会导致分段错误(无效的内存引用)
p[0] == *(p + 0)
这&p[0] == (p+0) == p
是10。
因此printf("%p", &p[0])
会给你10个。
p[1] == *(p + 1)
和&p[1] == (p+1)
由于,p
是一个字符指针,它以 为增量sizeof(char)
,即 1
因此printf("%p", &p[1])
会给你 10+1 = 11
char * p = &x;
这p
是一个指向整数的 char 指针x
值x
= 10
地址x
= 1000(假设)
因此p
= 1000
p[0] == *(p + 0)
和&p[0] == (p+0) == p
因此printf("%p", &p[0])
会给你1000
p[1] == *(p + 1)
和&p[1] == (p+1)
由于,p
是一个字符指针,它以 为增量sizeof(char)
,即 1
IE&p[1] == 1000+1 == 1001
p
并将&p[0]
被评估为相同的地址(数组的第一个元素的地址),即 10。
所以&p[0]
将被评估10
为11&p[1]
&p[0] + sizeof(char)
*p
但是,当您取消引用 p ( )时,您的代码很可能会出现段错误。
以下代码将始终打印True
.
main()
{
int* p;
printf("%s\n",p == &p[0] ? "True" : "False");
}
char *p=10;
目前的代码具有未定义的行为。指针p
未指向任何有效的内存位置以在该位置初始化 10。
话虽如此,两者都p
产生&p[0]
相同的内存位置。
您的代码中有一些错误:
int x = 10;
char * p = &x; // error 1 - you was assigning int to pointer
printf("%p\n", &p); // error 2 - you printing address of pointer (char **),
// so different format string is needed
printf("%p\n", &p[0]); // same error 2 - printing address of first byte in int x
printf("%p\n" , &p[1]); // same error 2 - printing address of second byte in int x
printf("%d", &p[0]);
printf("%d" , &p[1]);
它将打印出 p 所指向的地址.. 因为 char *p=x; 而 x = 10;
然后,, &p[0] = 10, &p[1] = 11 &p[2] = 12, 等等..
printf("%d", &p);
我对此不太确定,但据我所知,在我的情况下,它将打印出内存 10 中包含的值 = 10000
printf("%d", p);
它将打印出 10,即 *p 值;
cmiiw