数组指针:
指向数组元素的指针
数组指针的作用:
使用数组指针间接访问数组的元素
数组指针的定义:
int *p;
数组指针的初始化:
int a[4]={1,2,3,4};
int *p = a; //数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素
int *p = &a[0]; //等价上面一句话
数组指针如何访问数组的元素:
1)p+1 表示指向数组的下一个元素
2)p-1 指向数组的上一个元素
总结:
对于一个一维数组来说
int a[5];
1)获取 a[i]的地址有几种方法?
(1)&a[i]
(2)a+i
(3) int *p = a;
p+i
2) 获取 a[i]的值有几种方法?
(1)a[i]
(2)*(a+i)
(3) int *p = a;
*(p+i)
(4)*(&a[i])
应用:逆序数组:
void nixuArray(int a[],int len){
//定义数组指针
int *p = a;
//定义下标
int i = 0,j = len-1;
int temp;
while (i<j) {
//交换a[i] 和 a[j];
temp = *(p+i);
*(p+i) = *(p+j);
*(p+j) = temp;
//修改下标
i++,j--; //逗号表达式 依次计算表达式的值;
}
}
int main(int argc, const char * argv[]) {
int arr[10]={1,2,3,4,5,6,7,8,9,10};
//调用函数逆序数组
nixuArray(arr, 10);
//遍历数组
for (int i=0; i<10; i++) {
printf("%d\t",arr[i]);
}
return 0;
}
指针数组:
存放指针的数组,就是指针数组
指针数组的定义:
数据类型 * 数组名[数组长度];
int *pa[3];
//定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是int类型变量的指针)
指针数组的使用:
int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};
//打印的是指针数组的第一个元素得值
printf(" &a = %p\n",&a);
printf(" pa[0] = %p\n",pa[0]);
//打印指针数组的首地址
printf(" pa = %p\n",pa);
printf(" &pa[0]= %p\n",&pa[0]);
//访问a的值 a = 3
printf(" *(&a) = %d\n",*(&a));
printf(" *(pa[0]) = %d\n",*(pa[0]));
//使用数组名来访问 a的值
//*pa == pa[0] (a的地址)
//**pa
printf("%d\n",**pa);
int a1[2][2]={1,2,3,4};
//定义了一个指针数组 ,赋值为a1[0] 是第一行的地址
int *pa1[2]={a1[0],a1[1]};
printf("**pa1 = %d\n",**pa1);
//pa1+1 &pa1[1]
//*(pa1+1) pa1[1]
printf("**(pa1+1) = %d\n",**(pa1+1));
两个指针变量之间的运算
1)两个指针之间的减法运算
(1)0x0006 - 0x0003 = 3 (意义不大)
(2)常见的用法:两个指针都指向同一个数组
i.判断两个指针变量指向的元素是否连续
ii.判断两个指针变量之间相隔几个元素
int a[5]={1,2,3,4,5};
int *p = a; //p指向了数组的第一个元素
int *p1 = &a[3]; //p指向了数组的第四个元素
注意:两个指针变量之间没有加法运算
如果两个指针变量指向同一个元素 那么他们相减的结果是 0
判断两个指针变量指向的元素是否相邻(连续),他们相减的结果是 1的绝对值
//2、两个指针变量之间的关系运算
// p1 > p //使用大于或者小于来比较的 不是相减;
//1 表示p1在高位(这里就是p1>p)
//0 p在高位或者他们指向了同一个位置(这里可能是p1<p或者是p1=p)
printf("p1 > p = %d\n",p1 > p);
数组名访问二维数组之指针在二维数组中的应用;
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[i]+j 获取的 &a[i][j]
//*(a[i]+j) 获取 a[i][j]
//a[i] *(a+i)
//*(*(a+i)+j); -----> a[i][j]
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
//a[i] *(a+i)
//printf("%d\t",*(a[i]+j));
printf("%d\t",*(*(a+i)+j));
}
printf("\n");
}
|
|