16、指针

指针是C语言编程灵魂,但是也不要神话它,掌握住指针的实质很重要。

1、指针地址空间

指针:指针变量 用来存储内存地址编号。

地址:内存会按照字节进行编号,一个字节就有一个编号。

一般地址表示用十六进制 ,查看地址用%p

空间:指针本身的空间 和 指针指向的空间

cpp 复制代码
int a;						
int * p;
p = &a; 

指针指向谁就保存谁的地址,保存谁的地址就指向谁。

2、指针定义

指针是变量,也要遵循先定义在使用的原则,定义和变量的定义类似。

格式:

指向对象的数据类型 * 指针名;

指针对象的数据类型:学过的数据类型都可以,具体看需求

*:代表指针的标记

指针名: 自定义 p q t k head tail h

例子:

定义一个指针指向int型的变量: int * p;

定义一个指针指向char型空间: char * q;

定以一个指针指向 int [3]的空间:int (*q)[3];

3、指针赋值

指针使用前必须有明确的指向,也就是要有合法的地址值。

什么类型的指针存储什么类型的地址,但是对于指针变量来说存储的是地址值即可,因此也可以将地址强转赋值给不同类型的指针。

cpp 复制代码
// 先通过变量的形式拿到地址编号
int a = 10;  // &a	
int b = 20;  // &b	
	
// 让指针指向空间a
p = &a;    // *p就是a	
*p = 15;   // a == 15

p = &b;   // *p就是b,  对p赋值就改变了p的指向
*p = 35;   // b = 35;

char * q = (char *)&a;
// *q就是a的第一个字节的空间

4、指针操作指向的空间

表示:*指针名

后续操作需要看 类型决定后续操作。

int * p = 地址; *p是int型按int型操作

char *p = 地址; *p是char型按char型操作

struct book* 盘= 地址,*p是struct book 结构体类型,按结构体操作

5、指针本身空间

表示:指针名

操作的时候可能会改变指针的指向

指针本身空间大小和系统有关,32位--4个字节 , 64位 -- 8个字节

指针变量空间只存地址编号,能够存储地址编号即可,与指向对象类型无关。

6、指针偏移

前提:指针有明确的指向,

指针偏移和指针指向对象类型有关,以它为单位进行偏移。

指针指向对象类型 从 指针的定义 上看。

cpp 复制代码
char ch = 'a';
int b = 30;		
double d;		

char *p = &ch;		
int *q = &b;		
double *t = &d;
		
printf("%p %p %p\n",p,q,t);
printf("%p %p %p\n",p+1,q+1,t+1);

指针偏移偏移一般用于连续的空间 --- 数组、动态内存申请

cpp 复制代码
int arr[] = {5,29,30,57,8,49,20};			
int *p = arr;    // 等价于  p = &a[0]

printf("%d",*(p+0));   // arr[0]   在这里*解地址的意思
printf("%d",*(p+1));   // arr[0]   在这里*解地址的意思
相关推荐
许野平6 天前
Rust:指针 `*T` 和引用 `&T`的区别
开发语言·后端·rust·指针·引用
WeeJot嵌入式16 天前
C语言----指针
c语言·指针
意疏1 个月前
【C 语言指针篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章
c语言·开发语言·指针
LuckyLay1 个月前
Golang学习笔记_11——指针
笔记·学习·golang·指针
物联网牛七七2 个月前
24、宏定义和条件编译
条件编译·宏定义·c语言学习笔记
三月微暖寻春笋2 个月前
【和春笋一起学C++】OpenCV中数组和指针运用实例
opencv·指针·数组·二值化·遍历像素
沃和莱特2 个月前
C++中类的继承
数据库·c++·编程·c·指针·友元函数
—Miss. Z—2 个月前
C语言中用指针输入字符串
c语言·字符串·指针
桃酥4032 个月前
day13|C++重难点之 静态变量、全局变量、局部变量的区别,在内存上是怎么分布的、指针和引用的区别、C++内存分区
c++·指针·引用·内存分区·静态变量