前言:C语言指针是C语言中的一大部分,指针的正确使用能为程序带来更多的便利,为后面数据结构的学习打好基础,希望大家重视这一部分的学习。
一 指针 初阶
1.首先介绍‘&’与‘*’
&:作用是获取变量在内存中的地址。
‘*’:是用来定义指针变量,解引用指针类型
2.指针的含义:
变量的地址形象化被称为变量的指针,通过他可以访问地址的内存单元。
3.指针变量:int * a=&b;
指针变量的定义需要 类型说明 * 所定义的指针变量名
类型说明表示本指针变量所指向的变量的数据类型。
4.指针变量的赋值:
int a; int a;
int *p=&a; int *p;
第一种定义同时进行赋值。 p=&a;
第二种先定义再赋值
5.指针变量的引用:
* 指针变量 *p 解引用操作符,通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象
6.指针代表地址,指针在32位平台下占四个字节,在64位平台下占8个字节。
7.指针前面(类似int char double...)类型的意义
一 . int *访问四个字节 二。指针的类型决定指针+-1的操作时跳过几个字节
float*访问四个字节 指针-指针得到的是指针与指针之间元素的个数(前提 是指向同一块空间的指针)
char*访问一个字节 标准规定:允许指向数组元素的指针与指向数组最后一个元 素后面的那个内存位置的指针比较 但是不允许与指向第一 个元素之前的那个内存位置的指针进行比较。
double*访问八个字节
二 指针与数组
永远记住一点 一维数组:arr[1]=*(arr+1);
二维数组:arr[2][3]=*(*(arr+2)+3);
对于数组与指针我不想过多赘述,在各资料书均可查到相关具体内容。
指针无论怎么变化 它只代表地址,不要将指针想的太过复杂,循序渐进,通过多实战理解并掌握要领。
三 二级指针
int a=10;
int *p=&a;//p是一个一级指针变量
int **ppa=&p;//ppa是一个二级指针变量,用来存放int *指针类型地址
int**ppa---------(int*)代表ppa指向的对象是int*类型 第二个*代表ppa是一个指针。
四 指针数组与数组指针
1.指针数组:即为存放指针的数组 如int*parr[10]={&a,&b,&c};
其元素均为指针类型数据。
2.数组指针:指的是数组名的指针,即数组首元素地址的指针。 如int(*p)[10]={1,2,3,4,5,6};
p即为指向数组的指针又称为数组指针。
五 函数指针
int func(int x);//声明一个函数
int (*f)(int x);//声明一个函数指针
f=func;//将func函数的地址赋给指针f
1.定义函数指针类型:
typedef int(*fun_ptr)(int,int);
在此举一个利用指针的例子:
qsort 排序函数的使用以及模拟实现:
在上述例子中qsort是针对结构体类型进行的排序可以根据结构体内部定义的数据类型进行比较。
对qsort函数进行说明:
void qsort(void* base,//指针 指向待排序数组的第一个元素
size_t num,//是base指向的待排序数组的元素个数
size_t size,//base指向的待排序数组的元素大小
int (*compar)(const void*,const void*)//函数指针。指向两个元素的比较函数。
);
总结:指针即为地址,找准对应地址,利用指针方便进行运行。