1
#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. 我知道取消引用指针应该通过使用 * 和指针来完成。

查询:

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

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

3 、为什么输出4和1?

PL。解释。

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

4

3 回答 3

3

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

错误,您在此处分配了地址 >int *p = 0char *ch = 0. p包含地址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)= = 1 。4chsizeof(type_of(ch))sizeof(char)

于 2012-11-07T03:56:15.460 回答
2

首先,您的代码将指针打印为整数。虽然这可能是您想要做的,但它不是定义的行为,因为它在指针大小(以字节为单位)与int. 如果要打印指针值,请%p改用。

回答你的问题。您正在为两个指针赋值: 0 ,这是NULL的同义词。

第二。您获得 4 1 的原因是由于平台上int的大小与 a 的大小char。char 将是 1。在您的平台上,anint是 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
于 2012-11-07T03:57:38.907 回答
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;
}

希望这可以帮助。

于 2012-11-07T03:41:28.807 回答