为什么要打印地址差异(根据指针类型)

时间:2012-11-07 03:32:53

标签: c pointers increment

#include<stdio.h>
int main()
{
    int *p=0;
    char *ch=0;
    p++;
    ch++;
    printf ("%d and %d\n",p,ch);
    return 0;
}

输出:

4 and 1
  1. 我知道char指针在指向的地址中递增为+1。

  2. 我知道指向一个int的指针在gcc中的地址中也是+4,它也指向它。

  3. 我知道Derefrencing指针应该通过使用*和指针来完成。

  4. 查询:

    1. 为什么这不会为p和ch提供任何垃圾值,因为它们都是指针并且没有分配任何地址;

    2. 为什么这会给我相应指针在递增时获得的地址差异,或这是一个未定义的行为

    3. 3. 为什么输出4和1?

      PL。解释

      我已经在gcc-4.3.4上编译了这段代码。 它是一个C代码。 如果这是一个问题的副本,我很抱歉,因为我无法在stackoverflow上找到任何这样的问题。

3 个答案:

答案 0 :(得分:3)

  

1.为什么这不给p和ch任何垃圾值,因为它们都是指针并且没有分配任何地址;

错误,您在此处指定了地址&gt; int *p = 0char *ch = 0p包含地址0x00000000ch包含地址0x00000000

  

2.为什么这给了我相应指针在递增时获得的地址差异,或者这是未定义的   行为。

char *ch = 0;表示ch包含地址0。使用++递增地址会使值增加sizeof(char) viz 1。类似于整数。 p包含地址0.并使用++运算符将值增加sizeof(int),这似乎是您计算机上的4(注意,这并非总是如此,特别适用于64位机器)。

  

3.为什么这个输出是4 1?这里

首先,p包含0,然后在您的计算机上增加sizeof(type_of(p)) = sizeof(int) = 4ch增加sizeof(type_of(ch)) } = sizeof(char) = 1.

答案 1 :(得分:2)

首先,您的代码将指针打印为整数。虽然这可能是您要尝试的,但它不是定义的行为,因为它在指针大小(以字节为单位)与int的大小不同的平台上完全不可移植。如果要打印指针值,请改用%p

回答你的问题。您 两个指针分配值: 0 ,与 NULL 同义。

二。您获得4 1的原因是由于int的大小与平台上char的大小相对应。 char将是1.在您的平台上,int宽度为4个字节。递增指针时,编译器将自动将其引用的地址移动它所代表的基础类型的字节数。

#include<stdio.h>
int main()
{
    int *p=0;    // int is 4 bytes on your platform
    char *ch=0;  // char is 1 byte
    p++;         // increments the address in p by 4
    ch++;        // increments the address in ch by 1
    printf ("%d  and %d\n",p,ch);
    return 0;
}
编辑:您将获得类似的结果,但是如果支持的打印语句,请执行此操作:

#include<stdio.h>
int main()
{
    int *p=0;
    char *ch=0;
    p++;
    ch++;
    printf ("%p and %p\n",p,ch);
    return 0;
}

输出(在我的Mac上)是:

0x4 and 0x1

答案 2 :(得分:0)

据我所知,我已将问题的答案添加到内联:

#include<stdio.h>
int main()
{
    int x=0,*p=0;
    char c = 'A', *ch=0;
    x++; 

    // You have initialized this to 0, so incrementing adds 4 (int pointer)
    // Remember, the address '4' means nothing here
    p++; 

    // You have initialized this to 0, so incrementing adds 1 (char pointer)
    // Remember, the address '1' means nothing here
    ch++;

    // You are now printing the values of the pointers itself
    // This does not make any sense. If you are using pointers, you would want to know what is being referenced
    printf ("%d , %d  and %d\n",x,p,ch); 

    // This will FAIL
    // Because, you are now trying to print the data pointed by the pointers
    // Note the use of '*'. This is called de-referencing
    printf ("%d , %d  and %d\n", x, *p, *ch); 

    // Let p point to x, de-referencing will now work
    p = &x;
    printf ("%d , %d\n", x, *p); // 1, 1

    // Let ch point to c, de-referencing will now work
    ch = &c;
    printf ("%c , %c\n", c, *ch); // 'A', 'A'

    return 0;
}

希望这有帮助。