【C语言】指针1——基础(超级详解包懂)

指针1——基础概念与指针运算详解
Ciallo~ (∠・ω< )⌒★

1. 基础概念

先来个简易的思维导图
在这里插入图片描述

1.1 指针定义

1.1.1 内存

计算机内存(Memory)是用于临时存储程序和数据的硬件设备,CPU可直接访问,是计算机运行时的核心工作区域。CPU处理数据时,从内存中读取数据,处理后的数据也会放回内存中。它是外存与CPU沟通的桥梁,所有程序的运行都在内存中进行。通俗易懂地讲,内存是程序运行的舞台,指针是操作内存的工具。

1.1.2 地址

当我们买电脑的时候,电脑上内存是8G/16G/32G,那这些内存空间时如何高效管理的呢?其实也是把内存划分为一个个的内存单元,每个内存单元的大小取1个字节。每个内存单元也都有一个编号,有了这个内存单元的编号,CPU就可以快速找到一个内存空间。生活中我们把门牌号叫做地址,在计算机中我们把内存单元的编号也称为地址。C语言中给地址起了新的名字叫:指针。
所以我们可以理解为:
内存单元的编号 = 地址 = 指针

1.2 语法声明

在 C 语言中,指针可以指向各种数据类型,常见的指针数据类型包括:
整型指针(int*):用于指向整数类型的变量。
字符型指针(char*):用于指向字符类型的变量。
浮点型指针(float*):用于指向浮点类型的变量。
双精度浮点型指针(double*):用于指向双精度浮点类型的变量。
结构体指针(struct 结构体名*):用于指向结构体类型的变量。
数组指针,函数指针(后面会出单独的详解)

定义指针变量例子:int *p; 其中 * 紧邻 int 还紧邻 p 都是可以的,但将 * 紧邻变量名,可以更清晰地表明该变量是一个指针。

int *p;
// *表示p的类型是指针
// int* 是p的类型,整形指针

在 C 语言中,指针变量的大小取决于计算机的体系结构(例如 32 位还是 64 位)和编译器。通常情况下:
在 32 位系统中,指针大小通常为 4 字节(32 位)。
在 64 位系统中,指针大小通常为 8 字节(64 位)。
需要注意的是,无论指针指向的数据类型是什么,在同一个系统和编译器环境中,所有指针的大小都是一致的。

1.3 初始化

通过取地址操作符 & 可以得到一个变量的地址,在声明指针变量时可以这样写:

int a = 10;
int *p = &a;

1.4 解引用

解引用操作符(*),可以得到指针变量所指向地址中存放的值

int a = 10;
int *p = &a;
int b = *p;

*p 拿到了 p 中存放的值,再赋值给 b,b 的值也为 10

2. 指针运算

在这里插入图片描述

2.1 指针变量的意义

指针的类型决定了,对指针解引用的时候有多大的权限(⼀次能操作几个字节)。
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

2.2 算术运算

2.2.1 指针与整数

指针 ± 整数,就是根据指针类型判断跳过几个字节。例如,char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。
这就是指针变量的类型差异带来的变化。指针+1,其实跳过1个指针指向的元素。
上代码:

#include <stdio.h>
//指针+- 整数 
int main()
{
 	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 	int *p = &arr[0];
 	int i = 0;
 	int len = sizeof(arr)/sizeof(arr[0]);
 	for(i=0; i<len; i++)
 	{
 		printf("%d ", *(p+i));//p+i 这⾥就是指针+整数 
 	}
 	return 0;
}

2.2.2 指针与指针

指针 - 指针 得到的是两个指针之间的元素个数
如下:
在这里插入图片描述

2.2.3 指针自身

指针也可以进行自增或自减运算;即p++,p–
自增和自减的结果也是根据指针类型来决定跳过几个字节。

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[4];
	printf("%d\n",*(p++));
	printf("%d\n",*(p--));
	return 0;
}

结果如下:
在这里插入图片描述

2.3 指针比较

可以使用关系运算符(如 ==、<、<=、>、>=)对指针进行比较

如果两个指针指向同一数组中的不同元素,则可对它们进行大小比较。
直接比较时,可以使用相等运算符(==)来比较两个指针是否指向同一个内存地址。若指向同一地址,则它们相等;否则,不相等。

空指针可以使用相等运算符(==)来比较是否为空指针。若指针的值为 NULL 或 0,则表示为空指针。
在 C 语言中,不同类型的指针不能直接进行比较。如需比较,可将其转换为相同类型的指针后再进行比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值