指针=地址
指针变量:存放地址的变量。
指针变量的定义(声明):*的标识作用只产生在指针变量的定义或声明的时候。
指针变量的访问:地址;变量名
int *p;
取值运算符*:把内存地址中的数据取出来。
printf("地址访问a:%d\n",*(&a))
#include <stdio.h>
int main()
{
int a = 0x1234;
int *p = &a;
char *c ;
c=&a;
printf("p=%p\n",p);
printf("c=%p\n",c);
printf("a= %x\n",*p);
printf("a=%x\n",*c);
return 0;
}
?
*运算符会根据指针大小类型,访问不同的内存空间。
int *p为整型会访问完整的4个字节32位;而char *c是1个字节占8位,只能访问前面8位节点,剩下的24位全部被忽略。
指针区分类型:
①决定指向空间的大小:不同类型 int,char……不同类型占用空间不同。
②决定增量:不同类型数据,访问内存中的值时跨度不同。所以定义指针时要求变量一致。
?为什么要用指针:
①利用指针间接访问数值,实现两个数的交换:
#include <stdio.h>
void changeData(int *pdata1,int *pdata2){ //取地址的值交换数值
int temp;
temp = *pdata1;
*pdata1 = *pdata2;
*pdata2 = temp;
}
int main()
{
int data1 = 10;
int data2 = 20;
printf("交换前:data1 = %d,data2=%d\n",data1,data2);
changeData(&data1,&data2); //传递数据地址
printf("交换后:data1 = %d,data2=%d\n",data1,data2);
return 0;
}
②指针指向固定的区域:
#include <stdio.h>
int main(){
int a = 10;
printf("adress of a is 0x%p\n",&a);
int *p =(int *)0x000000000061FE2D; //指定p的空间地址为0x000000000061FE2D
printf("p = 0x%p\n",p);
return 0;
}
输入三个数a,b,c,不管怎么输入都是a,b,c三个数从大到小顺序输出:
#include <stdio.h>
int sortFromLagrest(int *a,int *b ,int *c){
int temp;
if(*a<*b){
temp = *a;
*a = *b;
*b = temp;
}
if(*a<*c){
temp = *a;
*a = *c;
*c = temp;
}
if(*b<*c){
temp = *b;
*b = *c;
*c = temp;
}
}
int main(){
int a;
int b;
int c;
puts("请输入三个数a,b,c:");
scanf("%d%d%d",&a,&b,&c);
sortFromLagrest(&a,&b,&c);
printf("a的值为:%d,b的值为:%d,c的值为:%d",a,b,c);
return 0;
}