C 打印地址差异的原因(根据指针类型)

C 打印地址差异的原因(根据指针类型),c,pointers,increment,C,Pointers,Increment,我知道字符指针在它所指向的地址中也会以+1的形式递增 我知道int的指针在gcc中的地址中也以+4递增 我知道对指针进行去法语化应该通过对指针使用*来完成 查询: 为什么p和ch都是指针,并且没有分配任何地址,所以没有给出任何垃圾值 为什么这会给我相应指针在递增时获得的地址差,或者这是一种未定义的行为 3.为什么输出为4和1 解释 我已经在gcc-4.3.4上编译了这段代码。 这是一个C代码。 很抱歉,如果这是某个问题的副本,因为我在stackoverflow上找不到任何此类问题。据我所知,我已

我知道字符指针在它所指向的地址中也会以+1的形式递增

我知道int的指针在gcc中的地址中也以+4递增

我知道对指针进行去法语化应该通过对指针使用*来完成

查询:

为什么p和ch都是指针,并且没有分配任何地址,所以没有给出任何垃圾值

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

3.为什么输出为4和1

解释

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

据我所知,我已在线添加了您问题的答案:

4 and 1

希望这能有所帮助。

据我所知,我已在线为您的问题添加了答案:

4 and 1
希望这有帮助

1.由于p和ch都是指针且未分配任何地址,因此为什么不为其提供任何垃圾值

错误,您在此处分配了地址>int*p=0和char*ch=0。p包含地址0x00000000,ch包含地址0x00000000

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

char*ch=0;表示ch包含地址0。使用++增加地址将使该值增加sizeofchar viz 1。整数也是如此。p包含地址0。使用++运算符将值递增sizeofint,在您的机器上似乎是4。注意,这并不总是正确的,尤其是对于64位机器

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

因为首先,p包含0,然后在您的计算机上按sizeoftype_of p=sizeofint=4递增,ch按sizeoftype_of ch=sizeofchar=1递增

1.由于p和ch都是指针且未分配任何地址,因此为什么不为其提供任何垃圾值

错误,您在此处分配了地址>int*p=0和char*ch=0。p包含地址0x00000000,ch包含地址0x00000000

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

char*ch=0;表示ch包含地址0。使用++增加地址将使该值增加sizeofchar viz 1。整数也是如此。p包含地址0。使用++运算符将值递增sizeofint,在您的机器上似乎是4。注意,这并不总是正确的,尤其是对于64位机器

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


因为首先,p包含0,然后在您的计算机上按sizeoftype_of p=sizeofint=4递增,ch按sizeoftype_of ch=sizeofchar=1递增

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

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

第二。您得到4 1的原因是由于在您的平台上int的大小与char的大小。字符将是1。在您的平台上,ANIT的宽度为4字节。当递增指针时,编译器将根据它所表示的基础类型的字节计数自动移动它所引用的地址

#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;
}

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

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

第二。您得到4 1的原因是由于在您的平台上int的大小与char的大小。字符将是1。在您的平台上,ANIT的宽度为4字节。当递增指针时,编译器将根据它所表示的基础类型的字节计数自动移动它所引用的地址

#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;
}

解释为什么要打印4 1。我知道我并没有让指针放松。你能在p=&x行中看出吗;printf%d,%d\n,x,*p;//4,4为什么4,4因为0+4=4和0+1=1,并且因为类型*的值乘以1会将指针引用的字节地址按类型大小的sizeofType 1单位递增,所以在递增之后,它会指向类型的下一个值。我不认为它会打印4,4,它会在inc之后打印1,1.x=1
rement和p的地址为x,p将为1。如果我错了,请纠正我。解释为什么打印4 1。我知道我并没有让指针放松。你能在p=&x行中看出吗;printf%d,%d\n,x,*p;//4,4为什么4,4因为0+4=4和0+1=1,并且因为类型*的值增加了1,指针引用的字节地址增加了类型大小的sizeofType 1单位,所以在增加之后,它指向类型的下一个值。我不认为它会打印4,4,它会打印1,1。当x=1时,p的地址是x,*p将是1。如果我错了,请纠正我。因此,这不是一种未定义的行为。根据不同机器上指针、int和char的大小,它将给我相同的输出。@tapasweni您需要再次阅读。将printf与%d格式说明符和指针参数一起使用是未定义的行为。递增指针(即使是空指针)当然是一种定义行为。这意味着指针p和ch中的地址现在是4和1,前面是零,这符合地址在我的机器中的存储规则。Pl如果我错了,请更正。@Tapaswen我将printf格式字符串中的%d格式更改为%p,它将被定义为行为。您没有打印整数或字符;您正在打印地址,即指针值。这仍然是未定义的行为。必须将%p的printf参数强制转换为void*。因此这不是未定义的行为。根据不同机器上指针、int和char的大小,它将给我相同的输出。@tapasweni您需要再次阅读。将printf与%d格式说明符和指针参数一起使用是未定义的行为。递增指针(即使是空指针)当然是一种定义行为。这意味着指针p和ch中的地址现在是4和1,前面是零,这符合地址在我的机器中的存储规则。Pl如果我错了,请更正。@Tapaswen我将printf格式字符串中的%d格式更改为%p,它将被定义为行为。您没有打印整数或字符;您正在打印地址,即指针值。这仍然是未定义的行为。必须将%p的printf参数强制转换为void*。
#include<stdio.h>
int main()
{
    int *p=0;
    char *ch=0;
    p++;
    ch++;
    printf ("%p and %p\n",p,ch);
    return 0;
}
0x4 and 0x1