一、 指针的定义、赋值

格式:变量类型 *变量名;

定义了一个指针变量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)();