/*
总结:
对于一个一维数组来说
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])
*/
#include <stdio.h>
/**
* 逆序一个数组
*
* @param a 数组名
* @param len 数组长度
*/
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 ",arr[i]);
}
return 0;
}
/*
指针数组:
存放指针的数组,就是指针数组
指针数组的定义:
数据类型 * 数组名[数组长度];
int *pa[3];
//定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是int类型变量的指针)
指针数组的使用:
int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};
pa[0] a的地址
pa
*/
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};
//打印的是指针数组的第一个元素得值
printf(" &a = %p
",&a);
printf(" pa[0] = %p
",pa[0]);
//打印指针数组的首地址
printf(" pa = %p
",pa);
printf(" &pa[0]= %p
",&pa[0]);
//访问a的值 a = 3
printf(" *(&a) = %d
",*(&a));
printf(" *(pa[0]) = %d
",*(pa[0]));
//使用数组名来访问 a的值
//*pa == pa[0] (a的地址)
//**pa
printf("%d
",**pa);
int a1[2][2]={1,2,3,4};
//定义了一个指针数组 ,赋值为a1[0] 是第一行的地址
int *pa1[2]={a1[0],a1[1]};
printf("**pa1 = %d
",**pa1);
//pa1+1 &pa1[1]
//*(pa1+1) pa1[1]
printf("**(pa1+1) = %d
",**(pa1+1));
return 0;
}
/*
两个指针变量之间的运算
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指向了数组的第四个元素
注意:两个指针变量之间没有加法运算
2)两个指针之间的关系运算
*/
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a[5]={1,3,5,7,9};
int *p = a; //p指向了数组的第一个元素
int *p1 = &a[1]; //p指向了数组的第四个元素
//地址差值 (p1-p)*sizeof(int)
printf("p1 - p = %ld
",p1 - p);
printf("p - p1 = %ld
",p - p1);
//如果两个指针变量指向同一个元素 那么他们相减的结果是 0
//判断两个指针变量指向的元素是否相邻(连续),他们相减的结果是 1的绝对值
//2、两个指针变量之间的关系运算
// p1 > p
//1 表示p1在高位
//0 p在高位或者他们指向了同一个位置
printf("p1 > p = %d
",p1 > p);
return 0;
}
//
// main.c
// 07-数组名访问二维数组
//
// Created by apple on 15/1/8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#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
",&a[0][1]);
printf("a[0]+1 = %p
",a[0]+1);
printf("*(a[0]+1) = %d
",*(a[0]+1)); //3
printf("&a[0][2] = %p
",&a[0][2]);
printf("a[0]+2 = %p
",a[0]+2);
//行指针 a[0] a[1] a[2]
//a+1 //第二行的首地址
//a+2 //第三行的首地址
printf("a[1] = %p
",a[1]);
printf("a+1 = %p
",a+1);
printf("a[2] = %p
",a[2]);
printf("a+2 = %p
",a+2);
// a+1 第二行第一个元素的地址
//*(a+1) == &a[1][0]
printf("*(a+1) = %p
",*(a+1));
printf("&a[1][0] = %p
",&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 ",*(a[i]+j));
printf("%d ",*(*(a+i)+j));
}
printf("
");
}
return 0;
}