c语言中的指针操作
我对指针操纵有怀疑c语言中的指针操作,c,pointers,C,Pointers,我对指针操纵有怀疑 main() { int x=10; // extra line added... char *p=x; printf("%d", &p) printf("%d", &p[0]); printf("%d" , &p[1]); } 此代码提供输出 地址:10。。 10 十一, 最后两个输出是如何实现的。。有人能给我解释一下吗 代码已更改 char *p=10; 代码目前具有未定义的行为。指针p未指向任何有效的内存位
main()
{ int x=10; // extra line added...
char *p=x;
printf("%d", &p)
printf("%d", &p[0]);
printf("%d" , &p[1]);
}
此代码提供输出
地址:10。。
10
十一,
最后两个输出是如何实现的。。有人能给我解释一下吗
代码已更改
char *p=10;
代码目前具有未定义的行为。指针p
未指向任何有效的内存位置以在该位置初始化10
char a = 10;
char *p = &a;
也就是说,p
,和p[0]
都产生相同的内存位置
char a = 10;
char *p = &a;
代码目前具有未定义的行为。指针p
未指向任何有效的内存位置以在该位置初始化10
char a = 10;
char *p = &a;
话虽如此,
p
,&p[0]
都会产生相同的内存位置。这是未定义的行为。char a = 10;
char *p = &a;
指针需要指向某个有效的对象,然后才能将某个值添加到该位置
char a = 10;
char *p = &a;
这是未定义的行为。
指针需要指向某个有效的对象,然后才能将某个值添加到该位置
char a = 10;
char *p = &a;
p
和&p[0]
将计算到相同的地址(数组第一个元素的地址),即10
因此&p[0]
将被评估为10
和&p[1]
到&p[0]+sizeof(char)
,即11
但是,当您取消引用p(*p
)时,代码很可能会出错
以下代码将始终打印True
main()
{
int* p;
printf("%s\n",p == &p[0] ? "True" : "False");
}
p
和&p[0]
将计算到相同的地址(数组第一个元素的地址),即10
因此&p[0]
将被评估为10
和&p[1]
到&p[0]+sizeof(char)
,即11
但是,当您取消引用p(*p
)时,代码很可能会出错
以下代码将始终打印True
main()
{
int* p;
printf("%s\n",p == &p[0] ? "True" : "False");
}
代码中的一些错误:
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
代码中的一些错误:
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
将解释两种情况: 场景1:
char*p=x代码>
x==10
,p
是用10(用户程序无法访问的地址)初始化的字符指针:p==10
p
(即,*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
场景2:char*p=&x代码>
这里的p
是一个指向整数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
将解释两种情况:
printf("%d", &p[0]);
printf("%d" , &p[1]);
场景1:char*p=x代码>
x==10
,p
是用10(用户程序无法访问的地址)初始化的字符指针:p==10
p
(即,*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
场景2:char*p=&x代码>
这里的p
是一个指向整数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
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
它将打印出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上面没有存储p指向的任何内容,它初始化p。当说“初始化p”时,初始化的值是多少?我不确定我抓到你了。请解释。初始化值为10。这可能是一个毫无意义的指针,但就这样吧!伙计们,我已经改变了密码…现在告诉我品脱这种行为的原因&p和p[0]上面没有存储p指向的任何内容,它初始化p。当说“初始化p”时,初始化的值是多少?我不确定我抓到你了。请解释。初始化值为10。这可能是一个毫无意义的指针,但就这样吧!伙计们,我已经改变了密码…现在告诉我真相