1

我对指针操作有疑问...

main()
{   int x=10;  // extra line added...
   char *p=x;

   printf("%d", &p)

   printf("%d", &p[0]);
   printf("%d" , &p[1]);
}

此代码给出输出

地址 10.. 10 11

最后两个输出是怎么来的..谁能给我解释一下..?

代码变了……

4

6 回答 6

3

这是未定义的行为。
在将某个值添加到该位置之前,指针需要指向有效的东西。

char a = 10;
char *p = &a;
于 2012-05-02T05:53:37.813 回答
2

将解释两种情况:

场景一: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

于 2012-05-02T09:10:23.550 回答
1

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");
}
于 2012-05-02T06:54:18.017 回答
0
char *p=10; 

目前的代码具有未定义的行为。指针p未指向任何有效的内存位置以在该位置初始化 10。

话虽如此,两者都p产生&p[0]相同的内存位置。

于 2012-05-02T05:51:56.770 回答
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
于 2012-05-02T06:55:53.760 回答
0
   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

于 2012-05-02T09:12:58.657 回答