1、指针和数组之间的关系 1)数组指针: 指向数组元素的指针变量 int a[5]; //a[0] a[1] 直接访问 目标:用地址也可以访问数组元素
(1)数组名访问 a存放的是数组的首地址(常量) *a == a[0]元素的值 a+1 指向数组的下一个元素 a-1 指向数组的上一个元素 *a+1 == a[0]+1; *(a+1) == a[1]元素的值
int *p; //指针变量 p = a; //p指向了数组a的第一个元素 p = &a[0];
p+1 指向数组的下一个元素 p-1 指向数组的上一个元素
*p == a[0]元素的值 *p+1 == a[0]+1; *(p+1) == a[1]元素的值
p = p+1; //p移动到了下一个元素 p++; *p++ == *(p++) == *(p = p+1)
2、指针数组 指针数组:数组的每一个元素都是一个指针 int a[2][3]={1,2,3,4,5,6}; // a[0] 1,2,3 a[1] 4,5,6 int *pa[]={a[0],a[1]}; printf("%d\n",**(pa+1)); //4
3、指针的运算 前提:两个指针必须指向同一个数组 运算:减法 实质:计算两个指针之间关系,判断指针的位置 p = a; p1 =&a[3] p1 - p > 0 表示p1在高位置 p1 - p < 0 表示p1在低位置 p1 - p = 0 表示p1和p指向了同一个位置
注意: 指针的运算,不能有加法的
4、指针和二维数组 指针和一维数组: 1)数组的指针 指向数组元素 2)指针数组 数组的每一个元素还是一个指针 a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; a[0] <--1 2 3 4 a[1] <--5 6 7 8 a[2] <--9 10 11 12 a[0]+1 == a[0][1] 地址 *(a[0]+1)== a[0][1] 的值 *(a+j) == a[j]的值 一维数组:a的值 用数组地址表示:*(a+i) 用数组名访问数组的每一个元素:*(*(a+i)+j) 指针和二维数组: 1)指针指向二维数组的元素 int (*p)[4]; //指针变量名 p p = a; 2)二维的指针数组 char *str[2][3]={{"abc","acb","ade"},{"abc","ddd","eee"}};
5、指针和字符串 1)字符串指针,用来保存字符串 char *s="agadsf"; // 有\0 2) 用字符串数组的方法 char ch[]="dafasdf";// 有\0 3) char *c = 'a';
4)字符串指针变量和字符数组的的区别
1)区别一,能否重新赋值问题 char ch[20]="xxxxx"; ch = "asdfasdf"; // 不可以的 ch是常量,存储的是数组的首地址 char *ss="xxxxxx"; //"xxxxxx" 0x01 ss = "xxx"; // 可以的,ss是指针变量,
2)区别二,存储的区别 char ch[10]="xxxx"; 存放的是栈区(可读可写) x x x x \0 0 0 0 0 0 0 0 ch[4]='A' char *str ="pppp";存放的是常量区(只读)
6、字符串数组 存储字符串的几种方式 1)二维的字符数组
char name[10][20]={ "fengjie", "suibian", "xxxxxx" };
2)用一维的指针数组存放字符串 char *name[10]={ "fengjie", "suibian", "xxxxxx" } |