1. 言中规定了数组名代表数组中的第一个元素(即序号为零的元素)的地址。因此,下面两个语句是等价的:
int * p;
p=&a[0]; //以下两句是等价的。
p=a; //这里的p就是指向数组的指针。
此时*p=a[0] *(p+1)=a[1] p+1=&a[1] 同时指向数组的指针也可以带有下标,如此处p[6]=*(p+6)
注意*和++的方向性:同一如下:*(P++)和*(++p)就有不同的理解
*(++P):先使p自增一次,然后再取*p,*p++中*和++的运算优先级是相同的但是由于++和*的结合性是自由至左,故可理解为p先++然后取*但是由于p++并不产生影响,故仍取原值。
*(P++):直接使用p,取*p然后自增一次。
如果p的值为a(即p=&a[0])的话,输出*(++P):最后的值为a[1]的值。而*(P++):最后输出的值为a[0]的值。这里使用a a+1什么的都可以,但是不允许使用a++;因为a作为指针常量不可以自加。
多维数组中,例如:
int a[3][4];
a //代表二维数组首元素的地址,需要注意a=a[0]=&a[0][0]
a+1; //这里的含义为a[1]。代表第一行的首地址。
a[0]+1: //这里的含义为a[0][1]。
a[0] //代表一位数组a[0]中第0列元素的地址,即a[0][0]
a[1]和*(a+1)等价,a[0]+1和*(a+0)+1的值都是&a[0][1]。*(a[0]+1)就是a[0][1]的值,*(*(a+0)+1)或*(*a+1)也是a[0][1]的值。a[i]和*(a+i)是等价的。a指向一维数组,a[0]指向a[0][0]元素。*a是指向列的指针详见P225
2. 如果数组什么都不赋值,系统随机赋值。加入给其中一个元素赋予了值,则其它值为0。
3. 指向行的指针前面加上一个*,就是转换为指向列的指针。
4. 可以使用字符串常量来初始化字符数组,这样系统自动在尾部加上’\0’,例char[]=”gongqingkui”;使用printf输出字符数组的时候必须使用数组的名字。包含一个以上的’\0’时,遇到第一个就自动停止。同时输入的时候就要使用数组名,这时的数组名就是数组的起始地址。
5. 使用字符串处理函数的时候必须在前面加上string.H文件。
6. puts输出gets输入strcat字符串连接strcpy字符串复制strcmp字符串比较消协字母比大写字母大。Strlen字符长度,strlwr小写,strupr大写
7. 变量的指针就是变量的地址。存放地址的变量就是指针变量。
8. *&a 先进行&a运算,得到地址,然后间接引用得到a的值。
9. ++和*为同一优先级,但是结合方向是至右向左。
10. 数组名是指针常量,不可以进行++运算。Int a[5];p=a;p+1等于&a[1];
11. 注意双重指向int **p;指向指针的指针
12. 直接定义的指针变量没有赋地址的情况下,他的情况是不可预见的,应该避免这种情况。有时在系统使用指针输入一组数据之后,再使用指针的时候应该赋初值。
13. int *p[4]先与[4]结合,认为是数组,然后结合指针就变成了指针数组。Int (*p)[4]先于(*P)结合是指针,指向长度为4的数组。
14. 如果开始的时候指针指向a[0][0]如果对她加一的话,她指向下一个元素。如果指针先指向a[0]指针加一就是a[1]。
15. char * str=”gongqingkui”; str存放的是字符串的首地址。Str指向字符串的第一个字符的地址,输出的时候用%s。这样可以对一个数组进行整体的输入输出。同时注意在字符串相互复制的时候加上’\0’。字符数组在定义的时候赋值初始化,而字符串可以在定义的时候也可以在其他时候初始化,
16. 数据类型 (*p)()数据类型是函数返回值的类型。P指向一个函数。此函数带回整形的返回值。Int *p()表示声明一个函数,返回值是指向整型变量的指针,在这样的函数中必须写上return返回一个指针。直接赋值可以将函数地址传给指针。P=max;//max为函数名。使用(*P)调用函数c=(*p)(a,b)
17. 指针可以进行相减的运算,对她进行相加的运算没有意义,指针可以进行比较,前面的元素的指针小于后面元素的指针。
|