C语言指针概念
1.指针
1.1.指针的类型
(1)是指针自身的类型;
(2)把指针声明语句中的指针名字去掉,剩下部分就是这个指针的类型;
(3)作用:在指针相互赋值时,同类型指针才可相互赋值;
(4)举例
int *p; /* 指针类型是int *; */
int **p, /* 指针类型是int **;*/
1.2.指针指向的类型
(1)是指针指向的数据(内存)的类型;
(2)把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型;
(3)作用:决定了指针变量所取空间内容的宽度,决定了指针变量每次增减时跳过的单位跨度;
(4)举例
int *p; /* 指针指向的类型是int ; */
int **p, /* 指针指向的类型是int *;*/
1.3.指针数组
(1)是一个数组,指一个数组里面装着指针,数组的元素全是指针;
(2)定义:int *p[n];
1.4.数组指针(也称为行指针)
(1)是一个指针,是一个指向数组的指针变量,指向了某个数组的首地址;
(2)定义:int (*p)[n],释义:p指向包含n个int元素的一维数组,所以初始化时要把一个一维数组的整体地址赋值给p。
(3)二维数组用法
int arr[][],p=arr;
将二维数组名(即第一行地址)赋值给数组指针变量,其实二维数组的每一行就是一个一维数组,
数组名arr就是第一行的地址,arr+1是第二行的地址,以此类推;
(4)一维数组用法
int arr[],p=&arr;
一维数组相当于只有一行,&arr就是一维数组的行地址;
(5)一维数组名是数组首地址,也是首元素的地址;
如:int arr[4];
arr是数组首地址,也是首元素的地址,那么arr+1是第二个元素的地址;
&arr是整个数组的地址,那么&arr+1是下一个arr[4]整个数组的地址;
(6)二维数组名是第一行地址;
1.5.指针函数
(1)是一个函数,返回值是一个指针,要注意返回的这个指针不能是局部变量,局部变量在函数调用完之后就被清掉了;
(2)举例:int *func(int a,int b);
1.6.函数指针
(1)是一个指针,是一个指向函数的指针变量,是调用函数的入口地址;
(2)每个函数都有一个入口地址,该入口地址就是函数指针所指向的地址;
(3)定义:int (*func)(int, int);
(4)举例:
int add(int a, int b); /* 定义函数 */
int (*ptr_add)(int, int); /* 定义函数指针,形参可以不用写 */
ptr_add = add; /* 初始化 */
1.7.函数指针和const
(1)函数指针常量(可能也叫常量函数指针),指针为常量;
(2)常规定义
int add(int a, int b); /* 定义函数 */
int (*const ptr_add)(int, int) = add; /* 定义函数指针,指针为常量,并初始化,因为是指针常量,后面是不能赋其它地址的 */
(3)typedef定义
typedef int (*PFUNC)(int, int); /* 定义一个函数指针类型 */
int add(int a, int b); /* 定义函数 */
PFUNC const ptr_add = add; /* 定义函数指针,指针为常量,并初始化,因为是指针常量,后面是不能赋其它地址的 */
const PFUNC ptr_add = add; /* 或者这样定义 */
2.指针和const
2.1.常量指针
(1)指针指向的内容是个常量,不能再改值;
(2)举例
int const *p;
const int *p; /* 习惯用这种定义 */
/* 上述两种是一样的,const修饰的都是*p,所以*p常量,指针p可变; */
(3)如何区分
a. const在 * 号左边,则为常量指针,指针可变,内容不可变
b. const在 * 号右边,则为指针常量,指针不可变,内容可变
2.2.指针常量
(1)指针本身是个常量,不能再指向其他地址;
(2)举例:
int *const p; /* const修饰的是p,所以指针p是常量,*p可变;*/
2.3.指向常量的指针常量
(1)常量指针和指针常量的结合,指针和指针指向的内存都不可变
(2)举例:
const int * const p; /* 第一种定义 */
int const * const p; /* 第二种定义 */
3.总结
以上就是今天要讲的内容,本文仅仅简单介绍了C语言指针的相关概念与定义,虽然简化了很多,但是关键知识点很多,希望能够帮助到大家。