一 指针的定义
指针储存着地址,这样打比方,变量是一个房间,而变量的值是入住的客人,指针是客人手里的钥匙。
认识几种基础符号
& 取址运算符
*间接运算符,可以得到指针地址所对应的值
二 定义一个指针
// 定义一个指针指向变量
int *p=&b;
// 前面的(int)的类型根据所指向的变量的类型而改变
// 定义一个指针指向一维数组
int *p1=&b;
// 定义一个指针指向二维数组
int b[3][4];
int (*p2)[4]=b;
//b可被理解为含有三个一维数组的一维数组,所以指针应该是指向一维数组的指针
p2 = &b[0];
//这种形式也可,b[0][0]虽然也可以,但是编辑器有时候会报错
三 数组与指针
数组在本质上也是指针,如数组名,n维数组的2—n-1维都算是指针
利用数组名访问数组元素
在一维数组中
*(a+1) 是a[1]的值
在二维数组中
*(*(b+1)+1) 是b[1][1]的值
以此类推…
四 指针与函数
1 以指针作为形参
int add(int *start,int *end)
{
int total=0;
while (start<end) {
total+=*start;
start++;
}
}
//在主函数中,我们可以使用数组名作为实参进行传递,也可以定义指针
2 以指针改变变量的值
int *p=&a;
*p=1;
//此时a也变为1
3 子函数利用指针返回
返回指向一个数组的指针
int *all()
{
int a[5]={1,2,3,4};
return a;
}
// 返回一个字符数组,可以直接printf("%s",retstring)
char * retstring()
{
static char name[10];
strcpy(name,"张汉青");
return name;
}
4 利用指针进行交换
在子函数中如果形参为变量,那么函数进行的是值传递,无法改变变量,若是以指针作为形参,可以进行址传递,改变变量的值
交换普通的变量
void swap(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp;
}
交换结构体
struct tem
{
int x;
char a[20];
int b[20];
};
//swaps用于交换数组里面的数
void swaps(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
}
// swap1用于交换数组
void swap1(int a[],int b[])
{
for (int i=1; i<=20; i++) {
swaps(&a[i],&b[i]);
}
}
void swap(struct tem *p1,struct tem *p2)
{
struct tem temp;
strcpy(temp.a, p1->a);
swap1(temp.b, p1->b);
temp.x=p1->x;
strcpy(p1->a, p2->a);
swap1(p1->b, p2->b);
p1->x=p2->x;
strcpy(p2->a, temp.a);
swap1(p2->b, temp.b);
p2->x=temp.x;
}