黑马程序员——C语言基础 指针
(以下内容是对黑马苹果入学视频的个人知识点总结)
(一)指针
首先指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。
1)指针变量的定义
1>定义的格式
类名标识符 *指针变量名;
int *p;
指针需要先定义然后再赋值
简单取值
int a = 10;
int *p;
p = &a;
简单改值
*p = 9;
定义的时候赋值
int a = 10;
int *p = &a;
指针变量都占用8个字节的存储空间,它存储的时数据的地址
2>指针可以实现修改实参
不能交换外面实参的值,仅仅是交换了内部指针的指向
3>指针可以清空
p=NULL;清空后的指针是不能再间接访问其他存储空间
1 #include <stdio.h> 2 3 int main() 4 { 5 /* 不建议的写法, int *p只能指向int类型的数据 6 int *p; 7 double d = 10.0; 8 p = &d;*/ 9 10 /* 指针变量只能存储地址 11 int *p; 12 p = 200; 13 */ 14 15 /* 指针变量未经过初始化,不要拿来间接访问其他存储空间 16 int *p; 17 printf("%d\n", *p); 18 */ 19 20 int a = 10; 21 /* 22 int a; 23 a = 10; 24 */ 25 26 /* 27 int *p; 28 p = &a; 29 */ 30 // 定义变量时的*仅仅是一个象征,没有其他特殊含义 31 int *p = &a; 32 33 // 不正确的写法 34 // *p = &a; 35 p = &a; 36 37 // 这个时候的*的作用:访问指向变量p指向的存储空间 38 *p = 20; 39 40 41 char c = 'A'; 42 43 char *cp = &c; 44 45 *cp = 'D'; 46 47 printf("%c\n", c); 48 49 return 0; 50 }
(二)指针与数组
可以定义指向一维数组的指针,可以使用指针遍历数组的元素
1 #include <stdio.h> 2 3 /* 4 1.数组元素的访问方式 5 int ages[5]; 6 int *p; 7 p = ages; 8 1> 数组名[下标] ages[i] 9 2> 指针变量名[下标] p[i] 10 3> *(p + i) 11 12 2.指针变量+1,地址值究竟加多少,取决于指针的类型 13 int * 4 14 char * 1 15 double * 8 16 */ 17 void change(int array[]); 18 19 int main() 20 { 21 // 20个字节 22 int ages[5] = {10, 11, 19, 78, 67}; 23 24 change(ages); 25 26 return 0; 27 } 28 29 // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素 30 void change(int *array) 31 { 32 printf("%d\n", array[2]); 33 //printf("%d\n", *(array+2)); 34 } 35 36 /* 37 void change(int array[]) 38 { 39 int s = sizeof(array); 40 41 printf("%d\n", s); 42 }*/ 43 44 void test() 45 { 46 double d = 10.8; 47 double *dp; 48 dp = &d; 49 50 printf("dp = %p\n", dp); 51 printf("dp + 1 = %p\n", dp + 1); 52 53 int ages[5] = {10, 9, 8, 67, 56}; 54 55 int *p; 56 // 指针变量p指向了数组的首元素 57 p = &ages[0]; 58 // 数组名就是数组的地址,也是数组首元素的地址 59 //p = ages; 60 61 /* 62 p ---> &ages[0] 63 p + 1 ---> &ages[1] 64 p + 2 ---> &ages[2] 65 p + i ---> &ages[i] 66 */ 67 68 //printf("%d\n", *(p+2)); 69 70 printf("%d\n", p[2]); 71 72 /* 73 for (int i = 0; i<5; i++) { 74 printf("ages[%d] = %d\n", i, *(p+i)); 75 }*/ 76 77 78 // printf("%p\n", p); 79 // printf("%p\n", p + 1); 80 // printf("%p\n", p + 2); 81 }
(三)指针与字符串
定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
1 #include <stdio.h> 2 3 int main() 4 { 5 char name[20]; 6 7 printf("请输入姓名:\n"); 8 9 scanf("%s", name); 10 11 // 'j' 'a' 'c' 'k' '\0' 12 13 //printf("%c\n", name[3]); 14 15 //printf("刚才输入的字符串是:%s\n", name); 16 17 return 0; 18 } 19 20 // 定义字符串数组 21 void test2() 22 { 23 char *name = "jack"; 24 25 //int ages[5]; 26 27 // 指针数组(字符串数组) 28 char *names[5] = {"jack", "rose", "jake"}; 29 30 // 二维字符数组(字符串数组) 31 char names2[2][10] = {"jack", "rose"}; 32 } 33 34 // 定义字符串 35 void test() 36 { 37 // 字符串变量 38 char name[] = "it"; 39 name[0] = 'T'; 40 41 //printf("%s\n", name); 42 43 44 // "it" == 'i' + 't' + '\0' 45 // 指针变量name2指向了字符串的首字符 46 47 // 字符串常量 48 char *name2 = "it"; 49 50 char *name3 = "it"; 51 52 //*name2 = 'T'; 53 54 //printf("%c\n", *name2); 55 56 printf("%p\n%p\n", name2, name3); 57 58 //printf("%s\n", name2); 59 }
(四)指向函数的指针
指向函数的指针的定义
定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
double (*p)(double, char *, int);
p = haha;或者 double (*p)(double, char *, int) = haha;
3.如何间接调用函数
1> p(10.7, "jack", 10);
2> (*p)(10.7, "jack", 10);
1>由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
2>指向函数的指针只要有两个用途:
①调用函数
②将函数作为参数在函数间传送