1.字符型数组和字符串的传参:
char str[32] = {"hello world"};
int fun(char *pstr);
字符串遍历:
while (str[i] != '\0')
{
i++;
}
while (*pstr != '\0')
{
pstr++;
}
2.二级指针:
指向一级指针变量的指针
int *p;
char *p;
double *p;
int **p;
3.void *指针:
用来保存地址
void *p; //所有指针都是8个字节
void * -> int *、char *、double * 不需要强制类型转换
int *、char *、double * -> void * 需要强制类型转换
void * 作为函数参数,可以传入char *、double *、int *的指针,实现一个函数原型下的不同类型指针的传参
4.const指针:
const == readonly
1.const int *p;
2.int const *p;
3.int *const p;
4.const int *const p;
5.int const *const p;
1和2是等价的
const 修饰 *p, p可以改变, *p不能改变
只能使用指针指向的空间数据,不能修改此数据
3
const 修饰 p, p不可以改变, *p可以改变,一定要初始化,否则该指针为野指针
永远指向某个空间的指针(比如数组的数组名)
4和5是等价的
const 修饰p *p, p不可以改变, *p不可以改变,一定要初始化
5.数组指针和指针数组:
1.数组指针:
数组指针是指针,指针指向整个数组
数组指针:对一维数组名&,值不变,类型升级为指向整个数组的数组指针
对数组指针*,值不变,类型降级称为指向数组第一个元素的指针
int a[5] = {1, 2, 3, 4, 5};
a可以理解为int *
注意:
在以下两种情况下a不能理解为int *型
1.sizeof操作
2.&操作
&int * == int **
&a == int (*)[5]
2.指针数组:
指针数组是数组,数组的每个元素都是指针
int *a[5]:定义一个数组,数组名为a,有5个元素,每个元素为int*型
char *pstr[5];
存放字符串数组用二维数组
操作字符串数组用指针数组