指针与数组
- 数组的地址:
数组名
、&数组首元素
- 指针是专门用于保存地址
- 由于数组的首元素的地址就是数组的地址,所以定义一个指针指向数组其实就是定义一个指针指向数组的首元素,所以数组的首元素是什么类型,那么指向数组的指针就是什么类型
int ages[] = {1,2,3};
// 下面两种方式都可以
int *p = &ages[0];
int *p = ages;
- 因为p指针存储的值和ages中存储的值相同,所以以前用ages得地方都可以使用p代替
int ages[] = {1,2,3};
int *p = ages;
p[0] = 888;
指针的用途
- 取值的时候,会根据指针类型所占用的字节去取出对应字节的数据
- 用于做加法运算,
指针+1,其实是加上指针类型所占用的长度
int ages[] = {1,5,10,15};
int *p = ages;
printf("%i\n",*p); // 输出1
printf("%i\n",*(p + 1));// 输出5
printf("%i\n",*(p + 2));// 输出10
printf("%i\n",*(p + 3));// 输出15
指针和字符串
- 因为数组名就是数组的地址,数组名保存的就是数组的第0个元素的地址,所以我们可以使用指针来保存字符串
- 通过指针保存一个字符串,其实就是保存的字符串的第0个元素的地址
char str[] = "yaof";
char *str2 = "yaof";
数组和指针保存字符串的区别:
如果通过数组来保存字符串,那么字符串是一个
变量
str,可以修改
如果通过指针来保存字符串,那么字符串是一个
常量
str2,不可以修改
数组保存的字符串存储在内存的
栈
中,而通过指针保存的字符串存储在常量区
存储在栈中的变量有一个特点,当作用域结束系统会自动释放该变量
存储在常量区中得值有一个特点,不会被释放,而且多个相同的值对应的地址相同
注意:用指针来保存字符串不可以修改
注意:指针不初始化不能随便使用
指针数组
char *names[4] = {"jiang", "zhao", "wang", "liu"};
函数指针
-
指向函数的指针的定义格式:
返回值类型 (*指针变量名)(参数列表)
- *: 代表是一个指针
- 指针变量名:代表指针变量的名称,区分不同的变量
- (*指针变量名):代表将来指向一个函数
- 返回值类型:代表指向的函数是否有返回值
- (参数列表):代表指向的函数的参数列表,没有参数时使用()
-
函数指针分成四种类型
- 没有返回值,没有参数
- 没有返回值,有参数
- 有返回值,没有参数
- 有返回值,有参数
// 没有返回值,没有参数
void (*functionP)();
functionP = sum;// 函数后面不能加括号
functionP();// 调用函数
// 没有返回值,有参数
void (*functionP)(int, int);
// 有返回值,没有参数
int (*functionP)();
// 有返回值,有参数
int (*functionP)(int,int);