#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
我知道char指针在指向的地址中递增为+1。
我知道指向一个int的指针在gcc中的地址中也是+4,它也指向它。
我知道Derefrencing指针应该通过使用*和指针来完成。
查询:
为什么这不会为p和ch提供任何垃圾值,因为它们都是指针并且没有分配任何地址;
为什么这会给我相应指针在递增时获得的地址差异,或这是一个未定义的行为。
3. 为什么输出4和1?
PL。解释
我已经在gcc-4.3.4上编译了这段代码。 它是一个C代码。 如果这是一个问题的副本,我很抱歉,因为我无法在stackoverflow上找到任何这样的问题。
答案 0 :(得分:3)
1.为什么这不给p和ch任何垃圾值,因为它们都是指针并且没有分配任何地址;
错误,您在此处指定了地址&gt; int *p = 0
和char *ch = 0
。 p
包含地址0x00000000
,ch
包含地址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)
= 4
,ch
增加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;
}
希望这有帮助。