学习C语言基础篇——初识指针

指针or地址???

指针概念

C语言中每个内存单元都有一个编号,有了这个内存单元的编号,CPU就可以快速找到一个内存空间,储存空间中一个字节里面能存放8个比特位。

bitBYTEKBMBGBTB
比特字节(8bit)1024字节1024KB1024MB1024GB

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

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

编程之路漫漫,行则将至

  • 31
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值