指针说白了就是地址。指针变量就是用来存放指针(地址)的变量。
1. 变量的指针和指向变量的指针变量 读起来很拗口,说白了就是变量的地址和用来存放变量地址的地址变量。因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向数组的指针变量,"指向"就是指存放数组的地址。只要理解了这个,指针也就不难了。另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。 1) 指针变量的定义 形式:类型标识符 *标识符 如:int *pointer; 要注意两点:*表示pointer是个指针变量,在用这个变量的时候不能写成*pointer, *pointer是pointer指向的变量。一个指针变量只能指向同一个类型的变量。如上面 pointer只能指向int型变量。 2)指针变量的引用 两个有关的运算符: & 取地址运算符 &a 就代表变量a的地址 * 指针运算符 *a 就代表变量a的值 2. 数组的指针和指向数组的指针变量 数组的指针指数组的起始地址,数组元素的指针指数组元素的地址。 1)指向数组元素的指针变量的定义与赋值 定义和指向变量的指针变量定义相同,c规定数组名代表数组的首地址,即第一个数组元素地址。 2)通过指针引用数组元素 我们通常引用数组元素的形式是a,如果用指针可以这样引用,*(a+i),或定义一个指针变量p,将数组a的首地址赋给p,p=a;然后用*(p+i)引用。 注意:指针变量p指向数组a首地址,则p++指向数组a的下一元素地址,即a[1]的地址。 3)数组名作函数参数 形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。 4)指向多维数组的指针和指针变量 以二维数组为居多。假设定义了一个二维数组a[3][4],那么 a代表整个二维数组的首地址,也代表第0行的首地址,同时也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。 假设a是一个数组的首地址,那么如果a是一维的,a+I代表第I个元素的地址,如果a是二维的,则a+I代表第I行的首地址。 那么第一行第二列的元素地址如何表示呢?a[1]+2或&a[1][2]或*(a+1)+2。 我们只要记住:在二维数组中a代表整个数组的首地址,a[I]代表第I行的首地址,a[I]与*(a+I)等价就行了。只要运用熟练了就没什么复杂的了。 5)指向由m个整数组成的一维数组的指针变量 如:int (*p)[4],p是一个指向包含4个元素的一维数组,如果p先指向a[0],则p+1指向a[1],即p的增值是以一维数组的长度为单位的,这里是4,举个例子: 假设a[3][4]=,p先指向a[0]也就是数组a的首地址,那么p+1就是a[1]的首地址即元素9的地址,因为在定义p时int (*p)[4],定义一维数组长度为4,所以p+1就等于加了一个一维数组的长度4。 3. 字符串的指针和指向字符串的指针变量 1)字符串的表示形式 c中字符串有两种表示形式:一种是数组,一种是字符指针 char string[]="I love c!"; char *str="I love c!"; 其实指针形式也是在内存中开辟了一个数组,只不过数组的首地址存放在字符指针变量str中,千万不要认为str是一个字符串变量。 2)字符串指针作函数参数 实际上字符串指针就是数组的首地址。 3)字符指针变量与字符数组的区别 ① 字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串 ② 对数组初始化要用static,对指针变量不用。 ③ 对字符数组赋值,只能对各个元素赋值,不能象下面这样: char str[14]; str="I love c!"; 对指针变量可以, char *str; str="I love c!"; 注意:此时赋给str的不是字符,而是字符串首地址。 ④ 数组在定义和编译时分配内存单元,而指针变量定义后最好将其初始化,否则指针变量的值会指向一个不确定
|