#include <stdio.h>
//指针就是地址;指针变量是存放地址的变量
//*有两个作用:标识作用和运算作用
int main()
{
int a = 10;
int *p;
p = &a;
printf("值:%d \n",a);
printf("地址:%p \n",&a);
printf("值:%d \n",*(&a));//*是取值符号,把后面跟的内存地址中的数据取出来
printf("值:%d \n",*p);
return 0;
}
#include <stdio.h>
//该实验用来观察不同类型的指针变量
//该试验说明定义指针时类型要一致
int main()
{
int a = 0x1234;
int *p = &a;
char *c = &a;
printf("int类型 的地址:%p\n",p);
printf("char类型 的地址:%p\n",c);
//发现地址一样
printf("int类型的值:%x\n",*p);
printf("char类型的值:%x\n",*c);
//int占4个字节,32位;所以可以全部显示出来
//char占1个字节,8位;所以只能显示一部分
printf("++p = %p\n",++p);
printf("++c = %p\n",++c);
//发现类型不同,跨越字长也不一样
return 0;
}
指针的用处1:下面例子,可以更好理解
#include <stdio.h>
void change(int data1,int data2)
{
int temp;
temp = data1;
data1 = data2;
data2 = temp;
}
int main()
{
int data1 = 1;
int data2 = 2;
printf("交换前:data1=%d,data2=%d\n",data1,data2);
change(data1,data2);
printf("交换前:data1=%d,data2=%d\n",data1,data2);
return 0;
}
通过上面代码可以发现,通过调用封装后的交换函数并不能真正实现调换,因为函数内的data1和data2的内存地址与main函数中的data1和data2中的内存地址并不一样,要想实现调换需要利用指针。如下:
#include <stdio.h>
void change(int *data1,int *data2)
{
int temp;
temp = *data1;
*data1 = *data2;
*data2 = temp;
}
int main()
{
int data1 = 1;
int data2 = 2;
printf("交换前:data1=%d,data2=%d\n",data1,data2);
change(&data1,&data2);
printf("交换前:data1=%d,data2=%d\n",data1,data2);
return 0;
}
指针用处2:指向固定区域
#include <stdio.h>
//指针在这里用做指向固定的区域
int main()
{
int a = 10;
printf("地址是:%p\n",&a);
unsigned int* p = (unsigned int*)0x000000000061FE33;
//上面这一句跟float a = (float)sizeof(arr)/sizeof(arr[0])差不多一个道理
printf("地址是:%p\n",p);
return 0;
}
例:
#include <stdio.h>
//输入三个数abc;不管怎么输入,输出时,abc有从小到大输出,用函数封装实现
void sort(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,b,c;
printf("请依次输入abc值:\n");
scanf("%d%d%d",&a,&b,&c);
sort(&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}