IntPointer到CharArray并在C中输入信息

时间:2017-06-30 10:35:12

标签: c arrays pointers memory types

我的计划

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'

我希望我明确表示我完全不理解哪一点,提前感谢您的努力。

1 个答案:

答案 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个,依此类推。

我希望这会有所帮助。