指针or地址???
指针概念
C语言中每个内存单元都有一个编号,有了这个内存单元的编号,CPU就可以快速找到一个内存空间,储存空间中一个字节里面能存放8个比特位。
bit | BYTE | KB | MB | GB | TB |
比特 | 字节(8bit) | 1024字节 | 1024KB | 1024MB | 1024GB |
内存单元的编号==地址==指针
Cpu从内存单元中拿数据,Cpu算完后数据再储存在内存中。Cpu和内存之间由地址总线、数据总线、控制总线相连接。Cpu访问内存中的某个字节空间,需要知道这个字节再内存中什么位置,因为内存中字节有很多,所以需要给内存进行编址,计算机中的编址通过硬件设计完成的,并非把每个字节的地址记录下来。这里的内存指的是运行内存。
对于内存的管理:内存划分为一个一个小空间,每个小的空间称为内存单元,每个内存单元的大小是1个字节。
你可以理解为 CPU和内存之间有32/64根线(代表32/64位计算机)每根线能有俩中信息,0和1,在电流的作用下 32根线 有无电流即可表示为01100110110101110010......一根线两个含义,两根线4个含义
1.2取地址符&
int main()
int a = 20;
printf("%P",&a);
int * pa = &a;
return 0;
& 取地址操作符,拿到a的地址
pa是一个变量,这个变量pa用来存放地址(指针)的,pa叫指针变量
int表示pa指向变量的类型
*表示pa是指针变量
每个字节都有地址 这里举个例子
在int 类型中 int a ,a占用四个字节,每个字节都有自己的地址,那么使用取地址操作符会取四个字节的地址吗???
编辑
通过实操我们看到了,实际上只有一个地址 取的是四个字节中 最小的那个地址,知道了最小的地址我们就能够推算出四个字节的地址了
1.3解引用操作符
我们只要拿到了指针,就可以通过指针找到指针的对象,这里通过解引用操作符(*)来实现
#include <stdio.h>
int main()
{
int a =100;
int *pa= &a;
*pa = 0;
return 0;
}
*pa的意思是通过pa存放的地址 找到指向空间,*pa就是a变量了
*pa = 0,这个操作符就是 把a改变成了0
pa 的类型 是int*
(这里把a修改交给了pa来操作,对a的修改就多了一种途径)
2.1指针变量的大小
32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4个字节才能存储。
如果指针变量是⽤来存放地址的,那么指针变的大小就得是4个字节的空间才可以。
同理64位机器,假设有64根地址线,⼀个地址就
是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变的大小就是8个字节。
无具体类型指针
void*
兼容性指针,能够接受所有类型的指针,实现范性指针需求,但不能直接进行加减解引用,
2.2const操作修改指针变量
const具有常属性,不能被修改,本质上还是变量,
#include <stdio.h>
int main()
{
int a =100;
int *pa= &a;
*pa = 0;
return 0;
}
const的位置很重要 ,放在哪里很重要,对指针的限制不一样
int main()
{
int n = 100;
int m = 200;
int //位置一// * //位置二// p =&n;
*p=50;
p =&m;
return 0;
}
const放在*的右边限制的是指针变量本身,指针不能改变他的指向,但是可以通过指针变量修改他所指向的内容。
位置一 *p=50失效
位置二 p=&100失效
2.3指针 + - 整数操作
指针类型决定了指针+1的步长,决定了指针解引用的权限
数组在内存中是连续存放的
例如 int char 两个不同的类型,不同的类型指针跳跃是不一样的
2.4指针 - 指针
指针-指针是指针之间元素的个数,计算的前提条件是两个指针指向同一块空间
strlen统计的字符串长度是\n之前的
数组名和首元素的地址是一致的
计算指针元素的个数有两种方法
1.使用count函数进行计算 2.首位指针相减即元素个数
2.5指针的关系运算
地址有大小之分,进行大小的比较
int main()
{
int arr[10]= {1,2,3,4,5,6,7,8,9,10];
return 0;
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
int* p = &arr[0];
int sz = sizeof(arr) / sizeof(arr[0]);
while (p < arr + sz)
{
printf("%d", *p);
p++;
}
return 0;
}
2.6野指针
野指针
一个局部将变量不初始化,它的值是随机的
这里举个例子,让大家认识一下野指针
int main()
{
int a =100;
int *p= &a;
printf("%d",p);
return 0;
}
//上述过程中是正常的指针定义和使用,下面展示野指针//
int main()
{
int*p;
printf("%p\n,p);
return 0;
}
编程之路漫漫,行则将至