*今天开始找一个地方存放复习资料~! 想到哪写哪吧_(:з」∠)_*
指针(一)
指针 定义:特殊类型变量,用来存放变量的地址。 一个变量的地址称为这个变量的指针;一个变量专门用来存放变量的地址,称为指针变量。 指针变量定义后,系统为之分配存储单元用来存放地址,长度为4字节(32位系统)。
类型名 *指针变量名[=<指针表达式>] 类型名:指针变量用来指向的类型。 *表示定义的是指针变量 例:
int *p;取地址运算符& 用来返回操作数的地址,与一个变量或者数组元素连用。通过&可以将某一个元素的地址赋给指针。 例:
int a=1; int *p; int p=&a;指针使用之前要先进行赋值,否则不确定。
间接访问运算符* 用来返回操作数所指的变量,与一个指针连用。
二级指针变量 类型名 ** 指针变量名 是指向指针变量的指针。 例:
int a=1; int *p=&a; int **pa=&p;指针数组 类型名 ** 指针数组名[元素个数] 一系列指针变量的集合。每一个元素都是一个指针变量,具有相同的存储类型,指向相同的数据类型。 例:
int *p[2];由p[0]和p[1]两个指针组成。都指向int类型数据。
指向常量的指针 const 类型名 *指针变量名[=<指针表达式>] 指针所指的对象是常量。(*p不可以修改,p可以修改)。 例:
int a=1; const int *p=&a;a不可以通过*p修改,但是可以通过a修改。
指针常量 类型名 * const 指针变量名[=<指针表达式>] 指针(p)不可以再指向其他对象,但是*p内容可以修改。
指针与一维数组 每个数组的起始地址称为数组的指针。一维数组的数组名就是起始地址,是一个指针常量。
int a[10]; int *p;a与&a[0]等价,所以
p=a;或
p=&a[0];通过指针可以访问数组元素,例如给a[0]赋值为5:
int a[10]={0}; int *p; p=a; *p=5;通过引用可以访问数组元素,例如给a[3]赋值为5:
int a[10]={0); int *p; p=&a[3]; *p=5;无论数组类型如何,如果指针p指向数组一个元素,那么p+1就指向数组下一个元素。 若*p=a[0],那么 *(p+i)=a[i] p+i和a+i等价,表示数组第i个地址,即&a[i]。 *(p+i)与*(a+i)等价,表示数组第i个元素,即a[i]。 p也可以带下标。p[i]与*(p+i)等价,为a[i]。
指针与二维数组 二维数组的数组名表示整个数组的首地址。 a表示a[0]的地址,即&a[0]。a+1表示a[1]的地址,即&a[1]。 所以,a+i表示a[i]的地址,即&a[i],是一个指向一维数组的指针。 a[0],a[1],a[2]是一维数组名,表示一维数组的首地址。 a[0]即是&a[0][0],a[1]是&a[1][0]。a[i]是&a[i][0]。 a[0]+i表示&a[0][i]。 *(a+i)等价于a[i]。 *(a+i)+j等价于a[i]+j,即&a[i][j]。 所以数组元素a[i][j]可以表示为: (a[i]+j)、((a+i)+j)、(a+i)[j]。
例题 1.下面程序的输出结果是?
include<iostream.h> void main() { int n[][3]={10,20,30,40,50,60}; int (*p)[3]; p=n; cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl; }解: 可以通过下标访问,所以p[0][0]指数组第一个元素,为10。 p[0]指数组第一行的地址,p[0]+1就是p[0][1]的地址为&p[0][1],所以*(p[0]+1)为20。 *p就是p[0],所以(*p)[2]就是p[0][2]为30。
一维数组: a <=> &a[0] a+1 <=> &a[1] *(a+1) <=> a[1] 二维数组: a[0] <=>&a[0][0] a[1]+1 <=> &a[1][1] *a[0] <=>a[0][0] *(a[1]+1 ) <=> a[1][1]
2.若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是:
1.p=s; 2.p=k; 3.p=s[0]; 4.k=s;解: p是指向char类型的指针。 s是二维数组首地址,s[0]的地址,是一个指向大小为10的一维数组的指针。 k是char类型,指向大小为3的一维数组的指针。 s[0]是一维数组首地址,表示&s[0][0]。 所以p和s、p和k、k和s的类型不同,1、2和4错误。
