您的位置:首页 > 编程语言 > C语言/C++

C语言指针初见(一)

2015-10-27 20:56 363 查看
最近一直在学习C语言指针,一直想总结一下,终于腾出来时间了,如果有写错的地方希望大家多多指正!

一个变量的地址称为该变量的“指针”。

如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”

指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)

定义一个整型变量int a;,定义一个指向变量a的指针变量int *p = a; 或int *p; p = &a;。此时p指向a,a的地址赋给指针变量p,而不是*p(即变量a)。*p 表示变量a。

定义指针变量:类型名 *指针变量名;

一个变量的指针的含义包括两个方面,一是以存储单元编号表示的地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。

不能通过执行调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

通过指针引用一维数组(整型):

若有整型一维数组:int a[10];

定义指针变量:int *p; p = a;(或p = &a[0])

一维数组名a不能代表整个数组,它代表的是数组首元素的地址,即此时是将数组首元素的地址赋给p。

在进行运算时“p++”代表指向下一个元素。(p++并不是单纯的加1,而是增加它所指向的数据类型所占的字节大小)

此时有p+i==&a[i]。*(p+i)==a[i]。

通过指针引用二维数组(整型):

若有二维数组:int a[10][10];

定义指针变量:int *p;

二维数组名a代表二维数组首元素的地址,现在的首元素不是一个简单的整型元素,而是由10个整型元素所组成的一维数组,因为a代表的是首行(即序号为0的行)的首地址。

二维数组里啊a[0],a[1],a[2]的类型为int *型。

因此可以定义p=a[0];则p++依次指向a[1]---a[99]。*p输出p指向的元素的值。

定义指向一维整型数组的指针变量:int (*q)[10]; q为指针变量,它指向包含10个元素的一维数组。q的基类型是一维数组。

对于二维数组:

(1)a二维数组名,指向一维数组a[0],即0行首地址。

(2)a[0] ,*(a+0),*a0行0列首地址。

(3)a+1,&a[1]1行首地址。

(4)a[1],*(a+1)1行0列元素a[1][0]的地址。

(5)a[1]+2,*(a+1)+2,&a[1][2]1行2列元素a[1][2]的地址。

(6)*(a[1]+2),*(*(a+1)+2),a[1][2]1行2列元素a[1][2]的值。

a[0],a[1],a[2]既然是一维数组名,而C语言又规定数组名代表数组元素的首地址,因此a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0]。也就是说a[1]的值是&a[1][0],a[2]的值是&a[2][0]。

二维数组名是指向行的,因此a+1中的"1"代表一行中全部元素的字节数。

一维数组名是指向列的,因此a[0]+1中的"1"代表一个a元素所占的字节数。

指向行的指针前面加上*,就变为指向列的指针。

指向列的指针前面加上&,就变为指向行的指针。

&a[i]和a[i]的值是一样的,但是含义不同。

&a[i]或a+i指向行。

*(a+i)或a[i]指向列。

当下标j为0时,它们的值相同,即它们代表同一地址,但是它们所指的对象是不同的,即指针的基类型不同。

通过指针引用字符串

char a[10];或char *a; a = (char *)malloc(10);

char *p = a;

此时p指向字符串a的第一个字符。

通过字符数组名能输出整个字符串,但不同通过整型数组名输出数组中所有元素。

可以通过字符指针变量输出整个字符串。

C语言中只有字符变量,没有字符串变量。

编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元。

字符指针变量的值可以改变,而数组名代表一个固定的值(数组元素首地址),不能改变。

字符数组中各元素的值是可以改变的,而字符指针变量指向的字符串常量的值是不能改变的。

指针数组: 类型名 *数组名[数组长度]。

char *s[3] = {" aa "," ccc "," nnn "};

int *a[3];数组中的元素存放的是地址。

指针数组比较适合用来指向若干个字符串,使字符串的处理更加灵活。

数组中s[0]用来存放字符串“aa”的首地址。

指向指针数据的指针:

char **p; (p=地址,*p=值。)

int **q; (q=地址,**q=值。)

*运算符的结合性是从右到左,因此**p相当于*(*p)。

后面的*p表示p是指针变量,前面的char*表示p指向char*(或int*)型数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: