一、 指针的定义、赋值
格式:变量类型 *变量名;
定义了一个指针变量p,且指针p只能指向char类型数据)
指针变量只能存储地址
指针的作用:能够根据一个地址值,访问对应的存储空间
4、指针的存储:任何指针都占8个字节的存储空间
5、指针的赋值:
① 先定义后赋值
1 int a = 10; 2 int *p; 3
② 定义的同时赋值
1 int a = 10; 2 int
③ 易错点
1 %p输出指针里面存储的地址值 2 不能乱用类型,比如int a = 10; float
6、指针清空
1 p = 0;
2 p = NULL;
二、指针的注意事项
1 //代码举例
2 //不建议的写法, int *p只能指向int类型的数据
3 int *p;
4 double d = 10.0;
5 p = &d;
6
7 // 指针变量只能存储地址
8 int *p;
9 p = 200;
10
11
12 // 指针变量未经过初始化,不要拿来间接访问其他存储空间
13 int *p;
14 printf("%d\n", *p);
15
16
17
18
19 // 定义变量时的*仅仅是一个象征,没有其他特殊含义
20 int *p = &a;
21
22 // 不正确的写法
23 p = &a;
24
25 // 这个时候的*的作用:访问指向变量p指向的存储空间
26 *p = 20;
三、指针和数组
1、 指针对数组元素的访问方式
1 int ages[5];
2 int *p;
3 p = ages;
数组名[下标] ages[i]
指针变量名[下标] p[i]
③ *(p + i)
2、 指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
3、数组与指针数据的传递
1 //代码举例
2 #include<stdio.h>
3 void change(int array[]);
4
5 int main()
6 {
7 // 20个字节
8 int ages[5] = {10, 11, 19, 78, 67};
9
10 change(ages);
11
12 return 0;
13 }
14
15 // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素
16 void change(int *array)
17 {
18 printf("%d\n", array[2]);
19
20 }
4、用指针遍历整个数组
1 // 数组名就是数组的地址,也是数组首元素的地址
2 p = ages;
3
4 for (int i = 0; i<5; i++) {
5 printf("ages[%d] = %d\n", i, *(p+i));
6 }
四、 指针与字符串
1、定义字符串的两种方式
利用数组
char name[] = "gaizuojia";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
利用指针
char *name = "gaizuojia";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
1 // 指针数组(字符串数组)
2 char *names[5] = {"jack", "rose", "jake"};
3
4 // 二维字符数组(字符串数组)
5 char names2[2][10] = {"jack", "rose"};
五、返回指针的函数
返回指针的函数的一般形式为:类型名 *函数名(参数列表)
1 #include <stdio.h>
2 char *names();
3
4
5 int main()
6 {
7 char *name = test();
8
9 printf("name=%s\n", name);
10
11 return 0;
12 }
13
14 char *names()
15 {
16 return "gaizuojia";
17 }
六、 指向函数的指针
1、定义指向函数的指针
1 double (*p)(double, char *, int);
2
3 p = haha;
或者
double (*p)(double, char *, int) = haha;
2、如何间接调用函数
① p(10.7, "gaizuojia", 10);
② (*p)(10.7, "gaizuojia", 10);
3、有返回值函数指针的定义
1 // 定义指针变量指向sum函数
2 // 左边的int:指针变量p指向的函数返回int类型的数据
3 // 右边的(int, int):指针变量p指向的函数有2个int类型的形参
4 int (*p)(int, int);
4、 无返回值函数指针的定义
1 // (*p)是固定写法,代表指针变量p将来肯定是指向函数
2 // 左边的void:指针变量p指向的函数没有返回值
3 // 右边的():指针变量p指向的函数没有形参
4 void (*p)();