【C语言】指针

1.1 指针的概念
指针变量也是一个变量
指针存放的内容是一个地址,该地址指向一块内存空间

1.2 指针变量的定义
可以定义一个指向一个变量的指针变量。
int *p; //表示定义一个指针变量
*p; //代表指针所指内存的实际数据
切记,指针变量只能存放地址,不能将一个 int 型变量直接赋值给一个指针。
int *p = 100;

1.3 &取地址运算符
&可以取得一个变量在内存当中的地址

1.4 无类型指针
定义一个指针变量,但不指定它指向具体哪种数据类型。可以通过强制转化将 void * 转化为其他类型指针,也可以用 (void *) 将其他类型指针强制转化为 void 类型指针。
void *p

1.5 NULL
NULL在C语言中的定义为(void *)0

1.6 空指针与野指针
指向NULL的指针叫空指针,没有具体指向任何变量地址的指针叫野指针。
【C语言】指针_第1张图片
1.7 指针的兼容性
指针之间赋值比普通数据类型赋值检查更为严格,例如:不可以把一个 double * 赋值给 int *
原则上一定是相同类型的指针指向相同类型的变量地址,不能用一种类型的指针指向另一种类型的变量地址。

1.8 指向常量的指针与指针常量
const char *p; //定义一个指向常量的指针
char *const p; //定义一个指针常量,一旦初始化之后其内容不可改变

1.9 指针与数组的关系
一个变量有地址,一个数组包含若干个元素,每个元素在内存中都有地址。
int a[10];
int *p = a;

1.10 指针运算
指针运算不是简单的整数加减法,而是指针指向的数据类型在内存中占用字节数做为倍数的运算。
char *p;
p++; 移动了 sizeof(char) 这么多的字节数
int *p1;
p1++; 移动了 sizeof(int) 这么多的字节数

赋值:int *p = &a;
求值:int I = *p;
取指针地址 int **pp = &p;
将一个整数加(减)给指针:p + 3; p – 3;
增加(减少)指针值 p++,p–
求差值 ,p1 – p2,通常用于同一个数组内求两个元素之间的距离
比较 p1 == p2,通常用来比较两个指针是否指向同一个位置。

1.11 通过指针使用数组元素
p+1 代表 &a[1],也可以直接使用 p[1] 表示 a[5]
p+5 代表 &a[5]
p++

1.12 指针数组
int *p[5];

1.13 指向指针的指针(二级指针)
指针就是一个变量,既然是变量就也存在内存地址,所以可以定义一个指向指针的指针。

int i = 10;
int *p1 = &i;
int **p2 = &p1;
printf("%d\n", **p2);

以此类推可以定义3级甚至多级指针。C语言允许定义多级指针,但是指针级数过多会增加代码的复杂性,考试的时候可能会考多级指针,但实际编程的时候最多用到3级,但3级指针也不常用,一级和二级指针是大量使用。
【C语言】指针_第2张图片
1.14 指向二维数组的指针

int buf[3][5] 二维数组名称,buf代表数组首地址
int (*a)[5] 定义一个指向int [5]类型的指针变量a
a[0], *(a + 0), *a 0行,0列元素地址
a + 1 第1行首地址
a[1], *(a + 1) 第1行,0列元素地址
a[1] + 2, *(a + 1) + 2, &a[1][2] 第1行,2列元素地址
*(a[1] + 2), ((a + 1) + 2), a[1][2] 第1行,2列元素的值

1.15 指针变量做为函数的参数
函数的参数可以是指针类型。,它的作用是将一个变量的地址传送给另一个函数。
通过函数的指针参数可以间接的实现形参修改实参的值
【C语言】指针_第3张图片
1.16 一维数组名作为函数参数
当数组名作为函数参数时,C语言将数组名解释为指针
int func(int array[10]);

1.17 二维数组名作为函数参数
二维数组做函数参数时可以不指定第一个下标。
int func(int array[][10]);
将二维数组做为函数的参数用例不是特别多见

1.18 const关键字保护数组内容
如果讲一个数组做为函数的形参传递,那么数组内容可以在被调用函数内部修改,有时候不希望这样的事情发生,所以要对形参采用const参数
func(const int array[])

你可能感兴趣的:(【C语言】指针)