C程序返回0,指针指向值3
我想在节目结束时,il会打印3,但实际上是0 有人能解释这是怎么发生的吗 代码如下:C程序返回0,指针指向值3,c,pointers,C,Pointers,我想在节目结束时,il会打印3,但实际上是0 有人能解释这是怎么发生的吗 代码如下: int arr[3] = {2, 3, 4}; char *p; p = arr; p = (char*)((int*)(p)); // two conversion, means nothing, omit printf("%d, ", *p); // point to 2, p = (int*)(p+1); // point to 3 ? printf("%d", *p); return 0;
int arr[3] = {2, 3, 4};
char *p;
p = arr;
p = (char*)((int*)(p)); // two conversion, means nothing, omit
printf("%d, ", *p); // point to 2,
p = (int*)(p+1); // point to 3 ?
printf("%d", *p);
return 0;
将整数数组视为字符数组。标记为“无意义”的行实际上意义重大
当您将
char*p
增加1时,您会将指针移动一个字节,但为了指向arr[1]
您需要将其增加sizeof(int)
字节。将p
声明为int*p
,然后p+1
将执行您需要的操作。您将整数数组视为字符数组。标记为“无意义”的行实际上意义重大
当您将
char*p
增加1时,您会将指针移动一个字节,但为了指向arr[1]
您需要将其增加sizeof(int)
字节。将p
声明为int*p
,然后p+1
将执行您需要的操作。由于p
是char类型,p+1
指向第一个整数开头后的一个字节。因此,当您通过解引用p读取一个字节时,您正在读取整数数组中包含零字节的位置。因为p
是char类型,p+1
指向第一个整数开头后的一个字节。因此,当您通过解引用p来读取一个字节时,您正在读取整数数组中包含零字节的位置。如果您递增指针,它将按其类型的大小递增。这里的p
是字符指针,如果您增加p
,它将指向下一个字符。由于字符为1字节,p+1
指向p
指向的下一个字节。如果p
是一个整数指针,p+1
将指向代码中的下一个整数i,e3。如果增加一个指针,它将按其类型的大小递增。这里的p
是字符指针,如果您增加p
,它将指向下一个字符。由于字符为1字节,p+1
指向p
指向的下一个字节。如果p
是一个整数指针,p+1
将指向代码中的下一个整数i,e3。发生了什么?
以下几行以int
格式打印char
内容(此处为*p
)
char *p;
printf("%d, ", *p);
它打印2
,因为(当前)机器是little endian(例如x86)。如果此代码在big-endian机器上运行,它将打印0
。[有关endian ness,请参见]
练习:如果阵列初始化更改为以下内容,则预期的打印输出是什么
int arr[3] = {0x1a2b3c4d, 3, 4};
指针增量
假设我们有
char * pc = 0xA0;
int * pi = 0xB0;
pc += 1; // pc = ?
pi += 1: // pi = ?
pc
和pi
的新值是什么
由于pc
是指向char
的指针,+1
将pc
增加sizeof(char)
,即1
但是,由于pi
是指向int
的指针,+1
将pi
增加sizeof(int)
。在32位系统中,sizeof(int)
通常为4,而在64位系统中,sizeof(int)
通常为8
pc += 1; // pc = 0xA1
pi += 1: // pi = perhaps 0xB4 or 0xB8
警告
为了知识和好奇心进行实验是可以的,但在实际代码中,通过将int
转换为char*
来访问int
的字节并不是一个好主意,这会导致各种endian可移植性问题。发生了什么?
以下几行以int
格式打印char
内容(此处为*p
)
char *p;
printf("%d, ", *p);
它打印2
,因为(当前)机器是little endian(例如x86)。如果此代码在big-endian机器上运行,它将打印0
。[有关endian ness,请参见]
练习:如果阵列初始化更改为以下内容,则预期的打印输出是什么
int arr[3] = {0x1a2b3c4d, 3, 4};
指针增量
假设我们有
char * pc = 0xA0;
int * pi = 0xB0;
pc += 1; // pc = ?
pi += 1: // pi = ?
pc
和pi
的新值是什么
由于pc
是指向char
的指针,+1
将pc
增加sizeof(char)
,即1
但是,由于pi
是指向int
的指针,+1
将pi
增加sizeof(int)
。在32位系统中,sizeof(int)
通常为4,而在64位系统中,sizeof(int)
通常为8
pc += 1; // pc = 0xA1
pi += 1: // pi = perhaps 0xB4 or 0xB8
警告
为了知识和好奇心进行实验是可以的,但在实际代码中,通过将
int
转换为char*
来访问int
的字节并不是一个好主意,这会导致各种endian可移植性问题。我明白了。你是说char*p后面是3个字节的0,这就是最终值。谢谢,非常清楚。标有“无意义”的行实际上没有任何作用。它将指针转换为int*
,然后返回到char*
。因为在目标位置实际上有一个int
,这是定义明确的,结果指针必须等于p
@Matt McNabb:Yep,你是对的,出于某种原因,我读它是因为它显式地将arr
,而不是p
转换为char*
。我的错,我明白了。你是说char*p后面是3个字节的0,这就是最终值。谢谢,非常清楚。标有“无意义”的行实际上没有任何作用。它将指针转换为int*
,然后返回到char*
。因为在目标位置实际上有一个int
,这是定义明确的,结果指针必须等于p
@Matt McNabb:Yep,你是对的,出于某种原因,我读它是因为它显式地将arr
,而不是p
转换为char*
。我的错。我很惊讶编译器让你把int*
赋值给char*