【C语言】指针(1):入门理解(课堂随笔)
目录
一、内存和地址
二、指针变量和地址
三、指针变量类型的意义
一、内存和地址
只要讲指针就离不开内存
因为指针就是访问内存的
计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数 据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何高效的管理呢? 其实也是把内存划分为⼀个个的内存单元,每个内存单元的大小取1个字节 计算机常见单位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内寄存器。int main()
{
int a = 10;//创建变量的本质是向内存申请一块空间,为a申请4个字节的空间
return 0;
}
指针变量和解应用操作符
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个字节
• 注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。
三、指针变量类型的意义
指针类型决定了指针进行解应用操作符的时候访问几个字节,也就是决定指针的权限。
int main()
{
int a = 0x11223344;
int * pa = &a;
*pa =0;
return 0;
}
//代码1
#include
int main()
{
int n = 0x11223344;
int *pi = &n;
*pi = 0;
return 0;
//代码2
#include
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)入门理解完整版
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!









