数组指针:用一个指针变量指向一个数组元素,就是数组指针 作用:使用数组指针间接访问数组元素 注意:(1)数组名a不代表整个数组,值代表数组首元素的地址 (2)”p=a“的作用是”把a数组的首元素的地址赋给指针变量p“。而不是”把数组a各元素的值赋值给p“
2. 在指针指向数组元素时,允许进行以下运算: +或+=, -或-=, 自加, 自减, 两个指针相减(只有p1和p2都指向同一数组中的元素时才有意义) int a[4]={1,2,3,4}; int *p = a; //数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素 int *p = &a[0]; //等价上面一句话 数组指针如何访问数组的元素: 1)p+1 表示指向数组的下一个元素 2)p-1 指向数组的上一个元素 注意:数组名a是一个常量,数组名 a是一个常量相当于 *(10++)这是错误的 //printf(" *a++ =%d\n",*a++); //错误的 下标法,如a形式 指针法,如*(a+i)或*(p+i) a是常量(a++错误),p是变量(p++正确)
4. 指针数组: 存放指针的数组,就是指针数组 指针数组的定义: 数据类型 * 数组名[数组长度]; int *pa[3]; //定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是int类型变量的指针) 指针数组的使用: int a=3,b=4,c=5; int *pa[3]={&a,&b,&c}; pa[0] a的地址 pa 数组首地址,又是变量a的地址 5. 两个指针变量之间的运算 1)两个指针之间的减法运算:两指针变量相减所得只差是两个指针所指数组元素之间相差的元素个数。 (1)0x0006 - 0x0003 = 3 (意义不大) (2)常见的用法:两个指针都指向同一个数组 i.判断两个指针变量指向的元素是否连续 ii.判断两个指针变量之间相隔几个元素 地址差值(p1-p)*sizeof(int) int a[5]={1,2,3,4,5}; int *p = a; //p指向了数组的第一个元素 int *p1 = &a[3]; //p指向了数组的第四个元素 注意:两个指针变量之间没有加法运算 如果两个指针变量指向同一个元素 那么他们相减的结果是 0 判断两个指针变量指向的元素是否相邻(连续),他们相减的结果是 1的绝对值 2)两个指针之间的关系运算 p1 > p //1 表示p1在高位 //0 p在高位或者他们指向了同一个位置 6. 数组名访问二维数组 #include <stdio.h> int main(int argc, const char *argv[]) { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; //列指针 //a[0] == &[0][0] a[0]+1==&a[0][1] a[0]+2==&a[0][2] printf("&a[0][1] = %p\n",&a[0][1]); printf("a[0]+1 =%p\n",a[0]+1); printf("*(a[0]+1) =%d\n",*(a[0]+1)); //3 printf("&a[0][2] = %p\n",&a[0][2]); printf("a[0]+2 =%p\n",a[0]+2); //行指针 a[0] a[1] a[2] //a+1 //第二行的首地址 //a+2 //第三行的首地址 printf("a[1] =%p\n",a[1]); printf("a+1 =%p\n",a+1); printf("a[2] =%p\n",a[2]); printf("a+2 =%p\n",a+2); // a+1 第二行第一个元素的地址 //*(a+1) == &a[1][0] printf("*(a+1) = %p\n",*(a+1)); printf("&a[1][0] = %p\n",&a[1][0]); //a+j 获取的&a[j] //*(a+j) 获取 a[j] //a *(a+i) //*(*(a+i)+j); -----> a[j] for (int i=0; i<3; i++) { for (int j=0; j<4; j++) { //a *(a+i) //printf("%d\t",*(a+j)); printf("%d\t",*(*(a+i)+j)); } printf("\n"); } return 0; }
|