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

2024-07-08 1545阅读

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

目录

一、内存和地址

二、指针变量和地址

三、指针变量类型的意义


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

一、内存和地址

只要讲指针就离不开内存

因为指针就是访问内存的

【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

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

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

二、指针变量和地址

CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,⽽因为内存中字节很多,所以需要给内存进⾏编址(就如同宿舍很多,需要给宿舍编号⼀样)。计算机中的编址,并不是把每个字节的地址记录下来,⽽是通过硬件设计完成的。 ⾸先,必须理解,计算机内是有很多的硬件单元,⽽硬件单元是要互相协同⼯作的。所谓的协同,⾄少相互之间要能够进⾏数据传递。但是硬件与硬件之间是互相独⽴的,那么如何通信呢?答案很简单,⽤"线"连起来。⽽CPU和内存之间也是有⼤量的数据交互的,所以,两者必须也⽤线连起来。不过,我们今天关⼼⼀组线,叫做地址总线。 32位机器有32根地址总线, 每根线只有两态,表⽰0,1【电脉冲有⽆】,那么 ⼀根线,就能表⽰2种含义,2根线就能表⽰4种含义,依次类推。32根地址线,就能表⽰2^32种含义,每⼀种含义都代表⼀个地址。地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传⼊CPU内寄存器。
int main()
{
int a = 10;//创建变量的本质是向内存申请一块空间,为a申请4个字节的空间
 
 return 0;
}

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

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

指针变量和解应用操作符

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;
 }

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

结论: • 32位平台下地址是32个bit位,指针变量⼤⼩是4个字节 • 64位平台下地址是64个bit位,指针变量⼤⼩是8个字节 • 注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。

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

三、指针变量类型的意义

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

int main()
{ 
  int a = 0x11223344;
  int * pa = &a;
  *pa =0;
  
   return 0;
}

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

//代码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)入门理解完整版

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

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]