【C语言】指针(1):入门理解(课堂随笔)

九.九 2024-07-10 08:05:02 阅读 100

目录

一、内存和地址

二、指针变量和地址

三、指针变量类型的意义


一、内存和地址

只要讲指针就离不开内存

因为指针就是访问内存的

计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数

据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何高效的管理呢?

其实也是把内存划分为⼀个个的内存单元,每个内存单元的大小取1个字节

计算机常见单位

<code>bit - ⽐特位

byte - 字节

KB

MB

GB

TB

PB

1byte = 8bit

1KB = 1024byte

1MB = 1024KB

1GB = 1024MB

1TB = 1024GB

1PB = 1024TB

内存单元编号==地址==指针

二、指针变量和地址

CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,⽽因为内存中字节很多,所以需要给内存进⾏编址(就如同宿舍很多,需要给宿舍编号⼀样)。计算机中的编址,并不是把每个字节的地址记录下来,⽽是通过硬件设计完成的。

⾸先,必须理解,计算机内是有很多的硬件单元,⽽硬件单元是要互相协同⼯作的。所谓的协同,⾄少相互之间要能够进⾏数据传递。但是硬件与硬件之间是互相独⽴的,那么如何通信呢?答案很简单,⽤"线"连起来。⽽CPU和内存之间也是有⼤量的数据交互的,所以,两者必须也⽤线连起来。不过,我们今天关⼼⼀组线,叫做地址总线。

32位机器有32根地址总线, 每根线只有两态,表⽰0,1【电脉冲有⽆】,那么 ⼀根线,就能表⽰2种含义,2根线就能表⽰4种含义,依次类推。32根地址线,就能表⽰2^32种含义,每⼀种含义都代表⼀个地址。地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传⼊CPU内寄存器。

<code>int main()

{

int a = 10;//创建变量的本质是向内存申请一块空间,为a申请4个字节的空间

return 0;

}

指针变量和解应用操作符

<code>int main()

{

int a = 10;

//&a --- &取地址操作符

//& 单目操作符

printf("%p\n",&a);

return 0;

}

//指针--地址

//指针变量--存放地址的变量

int main()

{

int a = 10;

//&a --- &取地址操作符

//& 单目操作符

//printf("%p\n",&a);

int* p = &a;//p是一个变量(指针变量),是一块空间

//编号-地址-指针

//int说明p指向对象是int类型的

//*在说明p是指针变量

return 0;

}

int main()

{

char ch = 'w';

char* pc = &ch;

return 0;

}

int main()

{

int a =10;

int * p= &a;

*p =0;//* -解引用操作符(间接访问操作符)

//a =0;】

//*&a = 0;//a = 0

printf("%d",a);//0?

return 0;

}

指针变量的大小

32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4 个字节才能存储。

如果指针变量是⽤来存放地址的,那么指针变的⼤⼩就得是4个字节的空间才可以。同理64位器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变的⼤⼩就是8个字节。

指针变量 - 存放地址的

                  地址产生:地址线上传输的

                   32根地址线 ——>地址是:32个0/1组成的二进制序列

                   要储存这样的地址:32bit位的空间 ==4个字节

int main()

{

printf("%zd\n", sizeof(char *));

printf("%zd\n", sizeof(short *));

printf("%zd\n", sizeof(int *));

printf("%zd\n", sizeof(double *));

return 0;

}

结论:

• 32位平台下地址是32个bit位,指针变量⼤⼩是4个字节

• 64位平台下地址是64个bit位,指针变量⼤⼩是8个字节

• 注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。

三、指针变量类型的意义

指针类型决定了指针进行解应用操作符的时候访问几个字节,也就是决定指针的权限

<code>int main()

{

int a = 0x11223344;

int * pa = &a;

*pa =0;

return 0;

}

<code>//代码1

#include <stdio.h>

int main()

{

int n = 0x11223344;

int *pi = &n;

*pi = 0;

return 0;

//代码2

#include <stdio.h>

int main()

{

int n = 0x11223344;

char *pc = (char *)&n;

*pc = 0;

return 0;

}

调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节改为0。

结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。

⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。

指针+-整数

int main()

{

int a =10;

int *pa = &a;

char* pc = &a;

printf("pa=%p\n",pa);

printf("pa+1 = %p\n",pa+1);

printf("pc = %p\n",pc);

printf("pc+1 = %p\n",pc+1);

return 0;

}

指针类型决定了指针进行+1,-1的时候,一次走远的距离

int * +1 --->走4个字节(整型大小)

char* +1--->走了1个字节(字符大小)

完整版:【C语言】指针(1)入门理解完整版



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。