C语言中的指针-指向指针数据的指针-学习笔记-40

引入

好吧,看到这个标题我是崩溃的,指针要指向数据,现在还有一个指针指向了指向数据的指针….
我们把这种指向指针数据的指针变量,称为指向指针的指针

绕一绕

1
char *name[]={"Book_a","Book_b","Book_c","Book_d"};

这是一个指针数组,数组元素存放的是后面字符串的首元素地址

1
2
3
4
5
char *name[]={"Book_a","Book_b","Book_c","Book_d"};
//定义了一个指针数组
char *p;
p=name+i;
// name+i 表示的是一个指针,这个指针指向 name[i] 这个元素包含的指针,这就是指向指针的指针了。

name+i 是一个指针,指向的是 name[i]
name[i] 这个数组元素存放的是一个指针,所以:
name+i 是指向指针的指针。

定义指向指针的指针

1
2
3
4
char *p;
// 表示一个指针变量 p
char **p;
// 表示一个指向指针的指针变量 p

我们知道 运算是从右向左结合的
**p 表示 `
( p )char p是一个指针变量,指向字符的指针 pchar **p `,表示指向指针 p 的指针。

例1

1
2
3
4
5
6
7
8
9
# include <stdio.h>
int main(){
char *name[]={"Book_a","Book_b","Book_c","Book_d"};
//定义了一个指针数组
char **p;
p=name;
printf("%d\n",*p+1);
printf("%s\n",*p);
}

执行结果
3977
Book_a

*p+1表示的是 Book_b 的首字母地址
*p表示的是 Book_a 的首字母地址,输出的为 Book_a

例2

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
char *name[]={"Book_a","Book_b","Book_c","Book_d"};
char **p;
for (int i=0;i<4;i++){
p=name+i;
printf("%s\n",*p);
}
return 0;
}

执行结果
Book_a
Book_b
Book_c
Book_d

从上面的例子我们就能知道:

1
2
3
p=name; //此时 p 表示的是 name 的地址,也是 name[0]的地址
*p = name[0]; //此时 *p 表示的是 name[0] 的值,因为是指针函数,所以还是 name[0] 的值还是地址。
**p =*name[0]; //因为 name[0] 存的是地址,所以我们用 * 号 吧这个地址后面对应的数据显示出来。

也就是说:
p 是 name 这个数组的地址
*p 是 name 这个数组元素的值,这个值是一个地址
**p 是 name 这个数组元素的值的地址对应的值。

例3

有一个整型数组,用一个指针数组指向了这个整型数组,我们用指针数组来输出这个整型数组的值。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(){
int a[5]={2,4,6,8,10}; //定义一个普通的整型数组
int *p_a[]={&a[0],&a[1],&a[2],&a[3],&a[4]};
//将整型数组各元素的地址赋值给指针数组
int **p; //定义一个指向指针的指针p
p=p_a;
for(int i=0;i<5;i++,p++){
printf("%d\n",**p); // **p 指向的就是 p_a 的首元素值内地址的值
}
return 0;
}

运行结果
2
4
6
8
10

注意
指针数组只能存放地址,不能存放别的。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!