指针和数组:
一个变量有地址,一个数组同样有地址。不同的是,一个数组包含有若干个元素,每个元素都要占据内存空间,且数组占据的内存空间也是连续的。指针变量也可以指向数组。
因此,在引用数组元素的时候,可以用下标法( 如a[6]),也可以使用指针法,
通过指向数组元素的指针找到所需的元素。使用指针法能够使目标程序质量高: 占内存少,运行速度高。
一个变量有地址,一个数组元素包含若干个数组元素,每个数组元素都在内存中占用存储单元,
它们都有相应的地址,这个地址就可以用指针来实现存储。
如:
int a[5];
int *p,*q;
p=&a[0];
q=&a[2];
*p=5;*q=8;
定义数组元素的指针变量的方法与定义指向变量的指针变量方法相同。
如:int a[10],*b; b=&a[5];
指针数组、数组指针、指向指针的指针:
1、指针数组:
形如:int * p[10]; //一个指针数组,数组里面有10个元素,每一个元素都是一个int型的指针
数组内的每一个元素都是一个指针变量(这时注意每个元素所占的内存单元大小是地址的长度而不是类型长度)
2、数组指针:形如:int (* b)[10];//一个数组指针,指针指向一个列长度为十的一个二维数组的第一行的行地址。
也称作行指针,该指针指向了一个长度为10的数组的行首地址;
如:b表示第一行的首地址;b+1表示第二行首地址
*(b) = b[0][0]; *(b+1) = b[1][0]; *(*(b+i)+j) = b[i][j]
3、指向指针的指针:形如: int **c = p;//二级指针c,指向了指针数组p的首地址&p[0],即指向了指针数组的第一个指针的地址
该指针大小也是取决于操作系统,它跟一级指针其实本质上是没有差别的,只是说是有连环指向的这种感觉。
c是指向指针的指针,因此它使用间接取址符时需要两次才能取出目标的内容。
比如:*c表示的是p[0]的地址,而**c表示的是p[0]地址中的内容
c == &p[0]; // 指针数组中第一个指针元素的地址
*c == p[0]; // 指针数组中第一个指针元素地址的内容,即目标变量的地址
**c == *p[0]; // 指针数组中第一个指针元素指向的目标变量值
总结:
指向指针的指针,可以这样理解,首先指向指针的指针可以把他看成一种特殊的变量,既然是变量就可以存储不同的元素,比如整形变量int a,a可以存储2,3,4这种普通的整型数据,只要将值付给a就行了,但指向指针的指针所存的元素比较特殊,存放的元素一般是存放地址的指针变量,比如我有三个指针变量,int *p1,*p2,*p3,那么我可以定义一个特殊的变量 int **p,我可以将p1的地址付给p,也可以将p2的地址付给p.比如p=&p1,(类似于int a,int *t,t=&a),那么p就代表了他所指向的变量p1或者p2的地址,而p所指向的变量是一个指针变量,*p代表着这个指针变量里面的值(注意值实际上是一个地址),**p代表着它所指向的指针变量的内容(地址)所指向的存储单元的内容(数值)。
一个变量有地址,一个数组同样有地址。不同的是,一个数组包含有若干个元素,每个元素都要占据内存空间,且数组占据的内存空间也是连续的。指针变量也可以指向数组。
因此,在引用数组元素的时候,可以用下标法( 如a[6]),也可以使用指针法,
通过指向数组元素的指针找到所需的元素。使用指针法能够使目标程序质量高: 占内存少,运行速度高。
一个变量有地址,一个数组元素包含若干个数组元素,每个数组元素都在内存中占用存储单元,
它们都有相应的地址,这个地址就可以用指针来实现存储。
如:
int a[5];
int *p,*q;
p=&a[0];
q=&a[2];
*p=5;*q=8;
定义数组元素的指针变量的方法与定义指向变量的指针变量方法相同。
如:int a[10],*b; b=&a[5];
Tips:C语言规定:数组名代表数组的首地址,也就是代表第一个元素a[0]的地址。
p=a; //p=&a[0];
p+1 ~ &a[1]
*(p+1) ~ a[1]
指针数组、数组指针、指向指针的指针:
1、指针数组:
形如:int * p[10]; //一个指针数组,数组里面有10个元素,每一个元素都是一个int型的指针
数组内的每一个元素都是一个指针变量(这时注意每个元素所占的内存单元大小是地址的长度而不是类型长度)
2、数组指针:形如:int (* b)[10];//一个数组指针,指针指向一个列长度为十的一个二维数组的第一行的行地址。
也称作行指针,该指针指向了一个长度为10的数组的行首地址;
如:b表示第一行的首地址;b+1表示第二行首地址
*(b) = b[0][0]; *(b+1) = b[1][0]; *(*(b+i)+j) = b[i][j]
3、指向指针的指针:形如: int **c = p;//二级指针c,指向了指针数组p的首地址&p[0],即指向了指针数组的第一个指针的地址
该指针大小也是取决于操作系统,它跟一级指针其实本质上是没有差别的,只是说是有连环指向的这种感觉。
c是指向指针的指针,因此它使用间接取址符时需要两次才能取出目标的内容。
比如:*c表示的是p[0]的地址,而**c表示的是p[0]地址中的内容
c == &p[0]; // 指针数组中第一个指针元素的地址
*c == p[0]; // 指针数组中第一个指针元素地址的内容,即目标变量的地址
**c == *p[0]; // 指针数组中第一个指针元素指向的目标变量值
总结:
指向指针的指针,可以这样理解,首先指向指针的指针可以把他看成一种特殊的变量,既然是变量就可以存储不同的元素,比如整形变量int a,a可以存储2,3,4这种普通的整型数据,只要将值付给a就行了,但指向指针的指针所存的元素比较特殊,存放的元素一般是存放地址的指针变量,比如我有三个指针变量,int *p1,*p2,*p3,那么我可以定义一个特殊的变量 int **p,我可以将p1的地址付给p,也可以将p2的地址付给p.比如p=&p1,(类似于int a,int *t,t=&a),那么p就代表了他所指向的变量p1或者p2的地址,而p所指向的变量是一个指针变量,*p代表着这个指针变量里面的值(注意值实际上是一个地址),**p代表着它所指向的指针变量的内容(地址)所指向的存储单元的内容(数值)。