Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序返回0,指针指向值3_C_Pointers - Fatal编程技术网

C程序返回0,指针指向值3

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;

我想在节目结束时,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;

将整数数组视为字符数组。标记为“无意义”的行实际上意义重大


当您将
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*