五、指针
1. 基础
- 数据存储结构:内存地址 <===> 实际值
- 一个指针变量其内存中实际值为一个地址;当然,它还有自己的地址
- 定义一级指针变量 : int*
- 引用指针指向变量 : *int
- 取变量地址 : &i
#include<stdio.h>
#include<stdlib.h>
/*
指针就是内存地址
内存地址就是指针
*/
main(){
int i=10;
//定义一个int类型的一级指针变量p,指针变量保存的值为一个int变量的地址
int* p;
//把i的地址赋给p
p = &i;
//指针取值 *p,把p指针指向的变量取出
printf("*p==%d\n",*p); //p==10
//也可以直接赋值
*p = 100;
printf("*p==%d\n",*p);//p==100
system("pause");
}
2.1 例子 - 交换两个变量
step 1 : 正常交换两个是正常的,见如下代码被注释部分。
step 2 : 使用此swap(int i,int j)方法,结果如下:
before i = 100
before j = 200
main &i = 0x62fe4c
main &j = 0x62fe48
swap &i = 0x62fe20
swap &j = 0x62fe28
after i = 100
after j = 200
在swap函数中新建了内存空间,初步分析c语言为值传递机制。
step 3 : 使用指针方法swap_use_pointer(&i , &j),之后的输出结果如下:
before i = 100
before j = 200
main &i = 0x9ffe4c
main &j = 0x9ffe48
swap_use_pointer &i = 0x9ffe4c
swap_use_pointer &j = 0x9ffe48
after i = 200
after j = 100
结果分析:
C语言参数传递为值传递,与Java相同。
相关源码如下:
#include<stdio.h>
#include<stdlib.h>
void swap(int i,int j){
int swap;
swap=i;
i=j;
j=swap;
printf("swap &i = %#x\n",&i);
printf("swap &j = %#x\n",&j);
}
void swap_use_pointer(int* i,int* j){
int swap;
swap=*i;
*i=*j;
*j=swap;
printf("swap_use_pointer &i = %#x\n",i);
printf("swap_use_pointer &j = %#x\n",j);
}
main(){
int i=100;
int j=200;
printf("before i = %d\n",i);
printf("before j = %d\n",j);
printf("main &i = %#x\n",&i);
printf("main &j = %#x\n",&j);
/* step1 int swap; swap=i; i=j; j=swap; */
//swap(i,j); //step2
swap_use_pointer(&i , &j);//step3
printf("after i = %d\n",i);
printf("after j = %d\n",j);
system("pause");
}
2.2 例子 - 返回多个值(一个以上)
由于传入地址,类似于Java中的传入对象的引用,所以可以直接操控多个变量,从而可以不用使用return。
#include<stdio.h>
#include<stdlib.h>
//返回多个值
handle(int* a, int* b){
*a=0;
*b=0;
}
main(){
int a=1;
int b=1;
handle(&a,&b);
printf("a=%d\n",a);
printf("b=%d\n",b);
system("pause");
}
2.3 例子 - 指针的长度
- 32位系统中指针的长度为4
- 64位系统中指针的长度为8
#include<stdio.h>
#include<stdlib.h>
main(){
int* iPoint;
char* cPoint;
printf("iPoint的长度 = %d\n",sizeof(iPoint));//8
printf("cPoint的长度 = %d\n",sizeof(cPoint));//8
system("pause");
}
3. 多级指针
- 定义:int**
- 取值:**a
#include<stdio.h>
#include<stdlib.h>
/* 多级指针:以int类型为例 */
main(){
//定义一个int类型的变量a,赋值为100
int a=100;
//定义一个一级指针
int* addr1 = &a;
//定义多级指针
//定义一个二级指针
int** addr2 = &addr1;
//定义一个三级指针,以此类推
int*** addr3 = &addr2;
//多级指针取值
printf("***a = %d\n",***addr3);// ***a = 100
//多级指针赋值
***addr3 = 200;
printf("a = %d\n",a);//a = 200
system("pause");
}