第七章 指针

指针的概念

系统给虚拟内存的每个存储单元分配了一个编号。从0x00 00 00 00 到0xff ff ff ff

这个编号称为地址。

指针就是地址。


指针变量:是个变量,用来存放一个地址。

1、无论什么类型的地址,都是存储单元的编号,在32位平台下都是4个字节。即任何类型的指针变量都是4个字节大小。

2、对应类型的指针变量,只能存放对应类型的变量的地址。

指针是一个地址,而指针变量是存放地址的变量。

指针变量的定义方法

1、简单的指针变量

数据类型 *指针变量名;

c 复制代码
int *p;//定义了一个指针变量p

在定义指针变量的时候*时用来修饰变量的,说明变量p是个指针变量。变量名是p。

2、关于指针的运算符

&取地址、*取值

c 复制代码
int a = 0x1234abcd;
int *p;
p = &a; //把a的地址给p赋值,&是取地址符号。
int num = *p;//*p代表取值,就相当于把a的值给了num,和num=a效果一样。

p保存了a的地址,也可以说p指向了a。

c 复制代码
int * pointer_1=&a,*pointer_2=&b;

说明:在定义指针变量时要注意:

(1)指针变量前面的""表示该变量的类型为指针型变量。指针变量名是pointer_1和
pointer_2,而不是
pointer_1和 pointer_2。这是与定义整型或实型变量的形式不同的。

上面程序不应写成:"*pointer_1=&a;"和"pointer_2=&b;"。因为a的地址
是赋给指针变量pointer_1,而不是赋给
pointer_1(即变量a)。

指针的大小

*代表的是该变量是指针型变量。

p1是指针变量,存储的是地址,大小位32位系统4字节大小,固定不变。

前边的类型修饰符表明地址存储的数据类型。

c 复制代码
	char* p1;
	short int* p2;
	int* p3;
	long int* p4;
	float* p5;
	double* p6;

通过指针引用数组

一个变量有地址,一个数组包含若于元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中),所谓数组元素的相针就是数组元素的地址。

引用

c 复制代码
int a[10]={1,3,5,7,9,11,13,15,17,19};//定义a为包含10个整型数据的数组
int * pi;//定义p为指向整型变量的指针变量
p=&a[0];//把a[0]元素的地址赋给指针变量p
p=a; //p的值是数组a首元素(即a[0])的地址


注意:数组名不代表整个数组,只代表教组首元素的地址。上述"p=a;"的作用是"把
a数组的首元素的地址赋给指针变量p",而不是"把数组a各元素的值赋焓p"。

取值

c 复制代码
*p;//是a[0]的值。
*a;//是a[0]的值。
*(p+1);//是a[1]的值。
*(a+1);//是a[1]的值。

如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元

素,p-1指向同一数组中的上一个元素

指针运算

做减法的护的结果是两个指针之间有多少个元素。

c 复制代码
	int a[10] = { 1,3,5,7,9,11,13,15,17,19 };
	int* p, * p1;
	p = a;
	p1 = &a[3];
	printf("%d", p1-p);

指针数组

数组中元素位相同类型的指针变量。

定义方式: int *p[5];

c 复制代码
	int* p[5];
	int a = 100;
	int b[10] = { 1,2,3,4,5,6,7,8,9,0 };
	printf("%d\n", sizeof(p));//指针数组的大小
	p[0] = &a;//数组0位置的指针变量指向a
	printf("%p\n", p[0]);
	printf("%p\n", &a);
	printf("%d\n", *p[0]);
	p[1] = &b[2];
	printf("%d\n", *p[1]);
c 复制代码
    //hello、china等并不是存放在数组中,而是文字常量区中
    //name[0]存放的是hello字符串的首地址。
	char *name[5] = {"hello", "china", "beijing", "test"};
	for (int i = 0; i < 4; i++)
	{
		printf("%s\n", name[i]);
	}

指针的指针

指针的指针,即指针的地址。

c 复制代码
int a = 100;
int *p;
p = &a;
int **p1;//*p1表示是一个指针,存放int*类型。
p1 = &p;
int ***p2;//*p2表示是一个指针,存放int**类型。

字符串和指针

相关推荐
电星托马斯6 小时前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生
march_birds11 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式12 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
jelasin13 小时前
LibCoroutine开发手记:细粒度C语言协程库
c语言
篝火悟者13 小时前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
神里流~霜灭14 小时前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
双叶83615 小时前
(C语言)单链表(1.0)(单链表教程)(数据结构,指针)
c语言·开发语言·数据结构·算法·游戏
艾妮艾妮16 小时前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
charlie11451419116 小时前
STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出
c语言·stm32·单片机·嵌入式硬件·gpio·数据手册
矿渣渣16 小时前
int main(int argc, char **argv)C语言主函数参数解析
c语言·开发语言