指针详解

总结:

最大的收获就是明白了二维数组指针和指针变量。二维数组指针和指针数组是:单个指针和多个指针的区别

二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"两边的括号不可少。而指针数组类型表示的是多个指针( 一组有序指针)在一般形式中"*指针数组名"两边不能有括号。例如: int (*p)[3];表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。 int *p[3] 表示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。

所有数据都存放在存储器中,存储器的一个字节成为一个内存单元,内存单元的编号叫地址。

一个指针是一个地址,是一个常量。

指针虽然实际上是一个地址,但它却是一个数据结构的首地址,它是指向一个数据结构的。

允许用一个变量来存放指针,这种变量称为指针变量。

int *p1;表示p1是一个指针变量,它的值是某个整型变量的地址。

指针变量同普通变量一样,使用前不仅要声明,还必须赋予具体的值。

数组名和数组的第一个元素的地址都是整个数组的首地址。

a[0]+0是一维数组a[0]+0号元素的首地址,a[0]+1是a[0]的1号元素首地址,由此可得:a[i]+j是a[i]的j号元素首地址,等于a[i][j]。

由a[i]=*(a+i)得a[i]+j等于*(a+i)+j,由*(a+i)+j是二维数组a的i行j列元素首地址,该地址的值为*(*(a+i)+j)。

二维数组长度表示:二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。

static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++)
for(j=0;j<4;j++) printf("%2d ",*(*(p+i)+j));

缓冲区的存在本身是为了减少硬盘等存储设备的读写次数

一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。

函数指针变量:指向函数的指针变量,通过指针变量可以找到并调用函数。

int (*pt)();空括号表示指针变量所指的是一个函数。

允许一个函数的返回值是一个指针(即地址)这种返回指针值的函数称为指针型函数

指针数组:一个数组的元素值是指针,int *pa[3];表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量,指针数组的每个元素被赋予二维数组每一行的首地址。可以通过一个指针数组来指向一个二维数组

对指向数组,字符串的指针可以进行加减运算

int *p[n];   p为指针数组,由n个指向整型量的指针元素组成

引自:https://blog.csdn.net/ad_ad_ad/article/details/1522145

原文地址:https://www.cnblogs.com/ymd12103410/p/9542563.html