指针的定义
指针(pointer)是一个值为内存地址的变量。char类型变量的值是字符,int类型变量的值是整数,指针变量的值则是地址。
例:若一个指针变量名为ptr,则可编写如下语言:
ptr=&r //把r的地址赋给指针变量ptr
这条语句被形容为“ptr指向r”。其中ptr是变量,&r是常量;ptr可以修改,&r不行。
如要创建指针变量,先要声明指针变量的类型(例如int float long char),要使用各种运算符↓
指针的使用
间接运算符*
在找出r的地址后用*找出存储在r的值。
a=*ptr; //把ptr指向的值赋给a
指针变量
声明指针变量时必须指定指针所指向的变量的类型,因为不同的变量类型占用不同的存储空间,一些指针操作要求知道操作对象的大小。程序也必须知道存储在地址上的数据类型。部分类型如下所示:
int *p=NULL;
int *pa=&a;
int *pb=&b;
long long *plong = &c; //定义long long 类型指针变量plong,并指向c
char *p1,*p2; //定义了char类型指针,
用指针交换变量
void swap(int *num_01,int *num_02 )
{
int tmp; //定义中间变量
tmp=*num_01; //将指针指向的值赋给中间变量
*num_01=*num_02; //
*num_02=tmp; //将中间变量的值赋给目标变量
printf("*num_01变量的内容:%d\n", *num_01);
printf("*num_02变量的内容:%d\n", *num_02);
}
不同指针类型的相互赋值
long long c=2; //long long 类型8字节
long long *plong = &c; //定义long long 类型指针变量plong,并指向c
int a=0x12345678; //定义了int类型变量a,占用4个字节地址空间,地址有4个
int b=0x57654321; //定义了int类型变量b,占用4个字节地址空间,地址有4个
printf("变量a的地址%#p ",&a);
printf("变量b的地址%#p \n",&b);
char *p1,*p2; //定义了char类型指针,
p1=(char *)&a; //强制类型转换 p1保存变量a地址
p2=(char *)&b; //强制类型转换 p2保存变量b地址
printf("p1的内容:%#p p2的内容:%#p ",p1,p2);//打印地址
printf("%#x %#x\n", *p1, *p2); //打印内容
p1++; //指针往下移动,也称指针变量自增
p2++;
printf("p1的内容:%#p p2的内容:%#p ",p1,p2);
printf("%#x %#x\n", *p1, *p2);
p1++; //指针往下移动,也称指针变量自增
p2++;
printf("p1的内容:%#p p2的内容:%#p ",p1,p2);
printf("%#x %#x\n", *p1, *p2);
p1++; //指针往下移动,也称指针变量自增
p2++;
printf("p1的内容:%#p p2的内容:%#p ",p1,p2);
printf("%#x %#x\n", *p1, *p2);
printf("普通变量c占用空间:%d\n",sizeof(c));//单位是字节
printf("long long指针变量plong占用空间:%d\n",sizeof(plong));//单位是字节
printf("long long类型变量c的地址:%#p\n",&c);//
printf("指针变量plong的值:%#p\n",plong);//
printf("普通变量a占用空间:%d\n",sizeof(a));//单位是字节
printf("字符指针变量p1占用空间:%d\n",sizeof(p1));//单位是字节
但输出结果却是: