C语言——指针
一、 指针的定义、赋值
1、定义格式:变量类型 *变量名;
char *p(定义了一个指针变量p,且指针p只能指向char类型数据)
2、指针的特点,指针变量只能存储地址
3、指针的作用:能够根据一个地址值,访问对应的存储空间
4、指针的存储:任何指针都占8个字节的存储空间
5、指针的赋值:
① 先定义后赋值
1 int a = 10; 2 int *p; 3 p = &a;
② 定义的同时赋值
1 int a = 10; 2 int *p = &a;
③ 易错点
1 %p输出指针里面存储的地址值 2 不能乱用类型,比如int a = 10; float *p = &a;
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)();