谭浩强C指针(二)

第一次看指针,看过两遍,整个一章节还是有些头大,先作整理:

一、变量的指针和指向变量的指针变量

1、变量的指针即是存储变量的内存地址;

2、存放变量地址的变量称为指针变量;

3、指针变量的定义:类型说明符 *指针变量名称

例:int *a;  //声明一个指针变量a,a存放的值为地址,该地址指向一个整型变量。

4、指针变量的引用:

(1)相关的运算符:

1)&:取地址运算符:作用对象为变量;

2)*:指针运算符:作用对象为指针变量。

(1)指针变量初始化:

int a;

int *p=&a;

(2)赋值语句:

Int a,*p;  //这里的*是指针变量说明符,与指针运算符含义不同

P=&a;

5、指针变量作为函数的参数

指针变量也是一种变量,自然可以作为函数参数,实际意义是将实际指针参数的值(即地址)赋值给调用函数的形式参数。

6、指针变量的其他运算:

(1)对指针变量的加减运算

int a[5],*pa;

pa=a;

pa=pa+2;//指向第三个元素,即a[2]

//指针变量的加减运算只能对数组指针变量进行(对其他无意义)

(2)两个指针变量之间的运算:只有指向同一数组的指针变量之间才是有意义的。

二、数组指针和指向数组的指针变量

1、数组指针的定义:指向数组的指针。定义如下:

int a[5];

int *p;      //因要指向的数组元素为整型数据,所以该指针变量也说明为int

p=&a[0];   //初始化,指向数组a,等同于p=a;

2、通过数组指针对数组元素进行引用:

如上例中,则可以用以下方式表示第二个数组元素:*(p+1),也可以用数组名:*(a+1),因为数组名a实质上是一个常量,表示的是数组首地址。但须注意a和p的区别:a是常量,p是指针型变量。所以p++是可以的,而a++是错误的。

3、当数组名作为函数参数时,传递的实质也是地址。

4、指向多维数组的指针和指针变量

(1)对于int a[3][4]={{0,1,2,3,},{4,5,6,7},{8,9,10,11}}这个二维数组,可分解为a[0]、a[1]、a[2]三个一维数组(a[0]={0,1,2,3},a[1]=…);对于a[0]数组,包含a[0][0],a[0][1],a[0][2]三个元素.

通过二维数组名对数组元素地址的引用:

1)a[0]表示该数组名和首地址,即a[0][0]的地址,也是整个二维数组的首地址。a,&a[0][0],a[0]均表示首地址,此外,*(a+i)和&a[i]也可以表示二维数组中第i行的首地址,因此*(a+0)即*a和&a[0]也表示二维数组首地址。其他行的首地址可以类推。//注意,该段中a是二维数组名。

2)i行j列元素的地址:

直接用&a[i][j],或*(a+i)+j,或 a[i]+j;

(2)指向二维数组的指针变量

定义格式:类型标示符 (*指针变量名)[二维数组的列数]。

以(1)中二维数组a为例,定义一个指向a的指针变量如下:

int  (*pa)[4];  //a中元素为整型,a有4列

通过指针变量对二维数组元素地址的引用:

第i行第j列元素地址:*(p+i)+j; 

三、函数指针变量

1、定义:

类型说明符 (*指针变量名)();//类型说明符表示该指针变量指向的函数返回值类型

2、作用:指向函数入口地址以调用函数 

四、指针型函数

指针型函数返回的是指针值。

int *ap(int x,int y)   //int表示该函数返回的指针指向的是一个整型数据

{…}   //函数体 

五、指针数组和指向指针的指针

1、指针数组表示数组元素为指针。各数组元素必须具有相同存储类型和指向相同数据类型。

2、指针数组的表示:类型说明符 *数组名[数组长度]。如 int *p[3]表示p是一个指针数组,有3个数组元素,存储的指针均指向整型数据。

3、指向指针的指针变量:如:int **p;表示指针变量p,其指向的依旧是一个指针变量:*p。

原文地址:https://www.cnblogs.com/tsembrace/p/3120167.html