C语言指针测试

C 语言指针测试

考题:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

int main()
{
    int str[] = {270, 30, 40};
    char *ptr = (char*)&str[0];

    for(int i=0; i<4;i++)
    {
        printf("%2d, %p\n", *ptr, ptr);
        ptr++;
    }
    return 0;
}

问题

在Linux或Windows平台上运行上面的程序,输出结果是怎样的?

答案

14, 000000000061FE08
 1, 000000000061FE09
 0, 000000000061FE0A
 0, 000000000061FE0B

分析

程序中首先定义了一个int类型的数组,然后从数组中拿出第一个数,将它强制转换为char类型的指针

1
2
3
4
5
int str[] = {270, 30, 40};
char *ptr = (char*)&str[0];
//转化一下
int str = 270;
char *ptr = (char*)&str;

下一步,进入循环打印数字。

观察for语句发现这是一个四次循环,打印输出的是ptr 地址中的值以及ptr 地址,输出之后ptr地址加一

1
2
3
4
5
for(int i=0; i<4;i++)
{
    printf("%2d, %p\n", *ptr, ptr);
    ptr++;
}

想要解出这个题的答案,我们需要了解C语言中,不同类型的数据占用内存地址的大小

类型32位平台(bytes)64位平台(bytes)
char11
short int22
int44
long int48
long long int88
long48
long long88
float44
double88
size_t48
ssize_t48

还有一个问题,我们需要了解大小端的概念:

大端模式:数据的高字节在低地址,低字节在高地址 小端模式:数据的高字节在高地址,低字节在低地址

一般常见的操作系统(Linux、Windows都是小端,Mac是大端)都是小端,而通讯协议则是大端

那么int类型的270在 Linux和Windows 的内存中怎样表示的呢?

表示:0000 1110, 0000 0001, 0000 0000, 0000 0000
字节:    1          2          3          4

从表格中我们可以发现,char 类型是占用1个字节的,而 int 类型是占用4个字节的。

那么 int 类型转化为 char 类型时,一个 int 类型就会转化为4个 char 类型的数据。

表示:0000 1110, 0000 0001, 0000 0000, 0000 0000
字节:    1          2          3          4
对应数:  14         1          0          0

这就是输出结果的由来,大家学废了吗?

Licensed under CC BY-NC-SA 4.0
最后更新于 May 16, 2024 11:09 +0800
使用 Hugo 构建
主题 StackJimmy 设计