C语言的指针类型

版权声明:转载请注明出处 https://blog.csdn.net/Hanoi_ahoj/article/details/83216207

目录

1 指针类型的大小

2 指针类型的作用



正文

指针类型

1. 指针类型的大小

在32位机器上,地址是32个0或1组成的二进制序列,如果每个比特位都给一个地址位,则32为机能编址的范围只为512MB,若以4字节编址,32位机则可以编址4GB。

在64位机器上,有64根地址线,则一个指针变量的大小是8字节。

对于以下代码:

int main(int argc, const char * argv[])
{
    printf("char* : %lu\n",sizeof(char*));
    printf("short* : %lu\n",sizeof(short*));
    printf("int* : %lu\n",sizeof(int*));
    printf("float* : %lu\n",sizeof(float*));
    printf("double* : %lu\n",sizeof(double*));
    printf("long double* : %lu\n",sizeof(long double*));
    return 0;
}
  • 64位机下的输出为:

-64

  • 32位机下的输出为:

gcc main.c -m32

问题来了:

为什么不同类型的指针大小都是一样的呢?为什么要这么设计?

2. 指针类型的作用

  • 指针类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。比如:char*的指针解引用只能访问一个字节,而int*的指针解引用就能访问四个字节。

看下面的这段代码:

int main(int argc, const char * argv[])
{
    int i = 0x11223344;
    int *pi = &i;
    *pi = 0;
    
    int c = 0x11223344;
    char *pc = &c;
    *pc = 0;
    
    return 0;
}

Debug看内存变化:

p

发现:

i=0x11223344在执行*pi=0;后全部变为了0

c=0x11223344在执行*pc=0;后只有高位变成了0

说明:int*类型的指针解引用后,操作权限是4个字节(int的大小)。

char*解引用后,操作权限仅为一个字节。

验证了:指针类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。

问题又来了:

为什么高位的44变为0了呢?

这和数据在内存中存储的模式有关。大小端模式

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

  • 指针类型决定了指针指向前或者向后一步有多大距离。

对于以下代码:

int main(int argc, const char * argv[])
{
    int n = 10;
    int *pi = &n;
    char *pc = (char*)&n;
    
    printf("&n : %p\n", &n);
    printf("pi : %p\n", pi);
    printf("pi+1 : %p\n", pi+1);
    printf("-----------------------\n");
    printf("pc : %p\n", pc);
    printf("pc+1 : %p\n", pc+1);
    
    return 0;
}

有在64位机下有如下输出:

pic

可以看到:

pi=pc=&n

但是:

pi+1pc+1 不同

pi+1 - pi = 8

pc+1 - pc = 1

验证了:指针类型决定了指针指向前或者向后一步有多大距离。


完,不足之处请指正。

猜你喜欢

转载自blog.csdn.net/Hanoi_ahoj/article/details/83216207
今日推荐