我的计划
int main() {
int int_array[5] = {1, 2, 3, 4, 5};
char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
int* int_pointer = char_array;
char* char_pointer = int_array;
for(int i=0; i < 5; i++) {
printf("[Integer pointer] points to %p, which contains the char '%c'\n", int_pointer, *int_pointer);
int_pointer += 1;
}
for(int i=0; i < 5; i++) {
printf("[Char pointer] points to %p, which contains the integer %d\n", char_pointer, *char_pointer);
char_pointer += 1;
}
}
产生以下输出:
[integer pointer] points to 0xbffff810, which contains the char 'a'
[integer pointer] points to 0xbffff814, which contains the char 'e'
[integer pointer] points to 0xbffff818, which contains the char '8'
[integer pointer] points to 0xbffff81c, which contains the char '
[integer pointer] points to 0xbffff820, which contains the char '?'
[char pointer] points to 0xbffff7f0, which contains the char '1'
[char pointer] points to 0xbffff7f1, which contains the char '0'
[char pointer] points to 0xbffff7f2, which contains the char '0'
[char pointer] points to 0xbffff7f3, which contains the char '0'
[char pointer] points to 0xbffff7f4, which contains the char '2'
考虑到我一般是C语言和计算机科学的新手这一事实,我只是不明白为什么int_pointer一方面包含递增时向前移动四个字节的信息,但是在另一方面,一次只读取一个字节,而char_pointer一次向前移动一个字节,一次只读取一个字节。那么int_pointer(char_pointer)究竟包含哪些信息呢?在我的逻辑中,所有信息都包含在指针中,为什么int_pointer(整数是一个长度为四个字节的数据结构)一次只读取一个字节,但是向前移动四个字节是没有任何意义的。时间。存储的信息在哪里只能读取一个字节而不是四个字节(尽管int_pointer被声明为int,这意味着它应该一次读取四个字节)?这个逻辑中的矛盾在于,如果所有信息都存储在指针中,那么为什么char_pointer(声明为一个字节)一次读取并跳转(如果递增)一个字节,而int_pointer(声明为四个) bytes)一次读取和跳转(如果递增)四个字节?
对于int_pointer,我期望的输出如下:
[integer pointer] points to 0xbffff810, which contains the char 'abcd'
[integer pointer] points to 0xbffff814, which contains the char 'eUNDEFINEDSTUFF'
[integer pointer] points to 0xbffff818, which contains the char 'UNDEFINEDSTUFF'
[integer pointer] points to 0xbffff81c, which contains the char 'UNDEFINEDSTUFF'
[integer pointer] points to 0xbffff820, which contains the char 'UNDEFINEDSTUFF'
我希望我明确表示我完全不理解哪一点,提前感谢您的努力。
答案 0 :(得分:2)
'abcd'没有字符。 该计划正在完成你所期望的。在内存中,字符存储为......
[ a ][ b ][ c ][ d ][ e ]
你将整数指针指向a的开头并说要读取一个字符(1个字节),所以它读取一个字节,a。然后递增整数指针。
before: [ a ][ b ][ c ][ d ][ e ] stuff.......
^ pointer
after: [ a ][ b ][ c ][ d ][ e ] stuff.......
^ pointer
现在指针已移动4个字节并指向e。你说要读取1个字节,所以它会输出e。从这里开始,您会遇到意外行为,如8所示,空白和?。
现在为整数数组。每个整数是4个字节,其中1是 0000 ..... 00001。关键是,那个位于最右边。
当你在内存中安排它时,它看起来像这样:
[00000000][00000000][00000000][00000001] [00000000][00000000][00000000][00000010] [00000000][00000000][00000000][00000011] [00000000][00000000][00000000][00000100] [00000000][00000000][00000000][00000101] and more stuff....
你把指针放在:
[00000000][00000000][00000000][00000001] [00000000][00000000][00000000][00000010] [00000000][00000000][00000000][00000011] [00000000][00000000][00000000][00000100] [00000000][00000000][00000000][00000101] and more stuff....
^ pointer
并且通过取消引用char指针来告诉它读取1个字节,因此您将00000001提供给printf中的%d。然后你增加
[00000000][00000000][00000000][00000001] [00000000][00000000][00000000][00000010] [00000000][00000000][00000000][00000011] [00000000][00000000][00000000][00000100] [00000000][00000000][00000000][00000101] and more stuff....
^ pointer
你告诉它通过你的取消引用读取一个字节,它为你的printf提供了一堆0,打印出一个0.稍后几个循环,你的指针到达00000010并输出一个2.如果你继续一些更多,你还有3个0和3个,3个0和4个,依此类推。
我希望这会有所帮助。