首页 > 代码库 > 【黑马程序员】————指针

【黑马程序员】————指针

 

一、指针变量的定义

1. 格式:变量类型 *指针变量名;
2. 举例:int *p; char *p2;
3. 注意:定义变量时的*仅仅是指针变量的象征

4.指针变量只能存储地址

5.指针就一个作用:能够根据一个地址值,访问对应的存储空间
6.指针变量p前面的int:指针变量p只能指向int类型的数据

7.任何指针都占用8个字节的存储空间

 

二、利用指针变量简单修改其他变量的值

1.指向某个变量

int a;

int *p;
p = &a;
或者
int *p = &a;

2.修改所指向变量的值
*p = 10;                                 //这个时候的*的作用:访问指向变量p指向的存储空间

3.在函数内部修改外面变量的值
int a = 10;
change(&a);

void change(int *n)
{
*n = 20;
}

4.清空指针

  p = 0;

  p = null;

5.指针变量未经过初始化,不要拿来间接访问其他存储空间

 

三、指针与数组

将数组当做函数参数传入时,会自动转为指针,

  1>利用一个指针来接收一个数组,指针变量p指向了数组的首元素
                  p = &ages[0];

  2>数组名就是数组的地址,也是数组首元素的地址
                  p = ages;

1.数组元素的访问方式
  int ages[5];
  int *p;
  p = ages;
  1> 数组名[下标] ages[i]
  2> 指针变量名[下标] p[i]
  3> *(p + i)

  /*
  p ---> &ages[0]
  p + 1 ---> &ages[1]
  p + 2 ---> &ages[2]
  p + i ---> &ages[i]
  */


2.指针变量+1,地址值究竟加多少,取决于指针的类型
  int * 4
  char * 1
  double * 8

 

四、指针与字符串

1.定义字符串的2种方式
  1> 利用数组
    char name[] = "itcast";
    * 特点:字符串里面的字符是可以修改的
    * 使用场合:字符串的内容需要经常修改

  2> 利用指针
    char *name = "itcast";
    * 特点:字符串其实是一个常量字符串,里面的字符是不能修改
    * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

2.定义字符串数组
  1> 利用二维字符数组
    char names[2][10] = {"jack", "rose"};

  2> 利用指针数组
    char *names[2] = {"jack", "rose"};

3.指针变量指向字符串的首字符

 

五、返回指针的函数

l   指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的

l   返回指针的函数的一般形式为:类型名 * 函数名(参数列表)

 

 

 1 #include <stdio.h> 2 char *test(); 3  4 /* 5  只要求能看懂 6  */ 7  8 int main() 9 {10     char *name = test();11     12     printf("name=%s\n", name);13     14     return 0;15 }16 17 char *test()18 {19     return "rose";20 }

 

六、指向函数的指针

1.      为什么指针可以指向一个函数?

函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址

2.      指向函数的指针的定义

定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);

3.      使用注意

l   由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的

l   指向函数的指针变量主要有两个用途:

    调用函数

    将函数作为参数在函数间传递  

 

 1   void test1() 2   { 3       // (*p)是固定写法,代表指针变量p将来肯定是指向函数 4       // 左边的void:指针变量p指向的函数没有返回值 5       // 右边的():指针变量p指向的函数没有形参 6       void (*p)(); 7        8       // 指针变量p指向了test函数 9       p = test;10      11      p();12      //(*p)(); // 利用指针变量间接调用函数13      14      //test(); // 直接调用函数15  }

 

七、指向指针的指针

 1 #include <stdio.h> 2 int main() 3 { 4     int a = 10; 5      6     int *p = &a; 7      8     int **pp = &p; 9     10     // a = 20;11     12     // *p = 20;13     14     /*15     (*pp) == p16     17     *(*pp) == *p = a18     19     **pp == *p = a20     */21     **pp = 20;22     23     printf("%d\n", a);24     25     //int ***ppp = &pp;26     27     /*28     char a2 = ‘A‘;29     char *p2 = &a2;30     */31     32     return 0;33 }