lijifeng

导航

黑马程序员——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>指向函数的指针只要有两个用途:

①调用函数

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

 

posted on 2015-03-23 18:23  lijifeng  阅读(259)  评论(0编辑  收藏  举报