1.访问数组中的第N个元素时:a[n-1]或*(a+(n-1));如第二个a[1]或*(a+1);
2.数组指针 int (*parr)[n];能够指向长度为n的数组的指针parr;
指针数组int *parr[n];包含n个含有int类型的指针的数组;
3.数组指针:
- 让数组指针指向数组a——parr=&a;
注意:如果写成parr=a;表示指向数组a的首地址,不是整个数组;
- 通过数组指针访问数组中的各元素——*(*parr+1) 访问到了数组a的第二个元素;
——for(int i=0;i<n;i++) printf("%d",*(*parr+i)); 打印了数组所有元素;
——或者for(int i=0;i<n;i++) printf("%d",(*parr)[i] );
- 用指针访问二维数组的各元素:可以把二维转化为一维再进行访问。
例如:
int b[2][3]={ {10,20,30},{40 50 60}};//转化为一维数组;
int (*parr)[3]=b;//此处B为指向第一个长度为3的指针,所以不用加&,表示将b赋给数组指针parr
//如访问数组中第二行第三列时:
//*(*(parr+1)+2);
for(int i=0;i<2;i++){
for(int j=0;j<3;j++)
printf("%d ",*(*(parr+i)+j));
printf("\n");
}
可以看出数组指针和数组名的共通之处,上述指针的输出就等于parr[i][j];
总结:一维数组名可看作一个普通指针,需要加&表示一个指针;而二位数组名可看作一个数组指针,指向的是一个数组,不需要用&。
4.指针与字符串常量:
char *pstr='apple';此时指针pstr即可表示指向第一个字符a的内存地址。也可以表示指向该字符串的指针。
so,根据两种的情况有不同的输出:
printf("%c",*pstr);解引用出来的是字符格式,即为 a;
printf("%s",pstr);打印字符串时,需要的是指向首字符的指针,而不是字符,因此不需要*。
注意:因为指针pstr所指为字符串常量,所以不要用指针修改字符串内容,字符串内容不允许修改。此处可将其定义为常量指针:const char*pstr="apple"; 来表示不能修改指针指向地址内的内容。
5.指针与字符数组
上面说到不能用指针来修改字符串常量,但是当使用字符数组时就可以对字符串内容进行修改了。举个栗子:
char str[]="apple";
*str=A;//将数组首地址的元素重新赋值为A;
printf("%s",str);
此时结果就变为:Apple;
一个小例题:运用指针,将字符串中的小写字母转换为大写字母。
#include <stdio.h>
int main()
{
char str[]="Tel:017No.88#";
for(int i=0;i<sizeof(str);i++)
{
if(str[i]>='a'&&str[i]<='z'){
*(str+i)-=32;
}
}
printf("%s",str);
return 0;
}
注意:*(str+i)指针从首地址移动,访问数组后面的每一个元素。
6.二维字符数组
适用于储存多个字符串。
例题:输入三个字符串,按照字符串的长度以升序方式打印字符串。