C语言指针
什么是指针?
C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。
它申明的形式如下:
type *varName
C 申明指针
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch /* 一个字符型的指针 */
int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针
C 初始化指针
- 方式一:使指针指向现有的内存
int x = 1;
int *p = &x;
上面 int *p = &x; 表示 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址
- 方式2:动态分配内存给指针
int *p;
p = (int *)malloc(sizeof(int) * 10);
free(p);
上面 malloc 表示C分配内存的一函数,分配的大小为 sizeof(int) * 10;
free(p); 表示释放内存,这里是释放了我们刚才开辟的一个内存p,
注意:
malloc 和 free 都在 stdlib.h 这个头文件里,也就是说需要引入这个头文件!
C 中的 NULL 指针
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序:
#include <stdio.h>
int main ()
{
int *ptr = NULL;
printf("ptr 的值是 %x\n", ptr );
return 0;
}
运行结果为
ptr 的值是 0
可以看到指针的地址为nil,即空值,也可以理解为0。在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是为操作系统保留的。但是,内存地址 0 有一个特别重要的意义,它表明改指针不指向一个可访问的内存位置。
那如何检查空指针?
if(ptr) /* 如果 p 非空,则完成 */
if(!ptr) /* 如果 p 为空,则完成 */
C中更多的指针的用法
概念 | 描述 |
---|---|
指针的算术运算 | 可以对指针进行四种算术运算:++、--、+、- |
指针数组 | 可以定义用来存储指针的数组。 |
指向指针的指针 | C 允许指向指针的指针。 |
传递指针给函数 | 通过引用或地址传递参数,使传递的参数在调用函数中被改变。 |
从函数返回指针 | C 允许函数返回指针到局部变量、静态变量和动态内存分配。 |