黑马程序员——C语言基础 指针

时间:2022-08-31 00:26:53

 Java培训、Android培训、iOS培训、.Net培训、期待与您交流!                                                     

                                 (以下内容是对黑马苹果入学视频的个人知识点总结)

(一)指针

   首先指针是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>指向函数的指针只要有两个用途:

①调用函数

②将函数作为参数在函数间传送