这里对指针的理论知识不做多的讨论,简单列举几例,以便参考
可以把指针理解为内存的地址编号。也就是,指针就是地址,地址就是指针。
1.指针变量
本质是个变量,存放的是指针。
指针在32位平台的计算机中都是4个字节,在64位平台的计算机中都是8字节。
测试:
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("%ld\n",sizeof(char *));
printf("%ld\n",sizeof(short *));
printf("%ld\n",sizeof(int *));
printf("%ld\n",sizeof(long *));
printf("%ld\n",sizeof(float *));
printf("%ld\n",sizeof(double *));
printf("%ld\n",sizeof(void *));
return 0;
}
指针变量的使用
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num = 66;
int *p; //定义个指针变量
p = #//指针变量赋值
printf("p = %d\n",*p);
*p = 88; //改变指针变量的内容
printf("p = %d\n",*p);
num = 99; //通过修改num改变指针变量的内容
printf("p = %d\n",*p);
return 0;
}
运行结果:
p = 66
p = 88
p = 99
指针变量的跨度
由指针变量指向的类型大小决定。
指针变量自身的类型: 将变量名 拖黑 剩下啥类型 指针变量自身就是啥类型。
指针变量指向的类型:将变量名和离他最近一个* 一起拖黑 剩下啥类型 指针变量指向的类型就是啥类型。
我的电脑是64位的,所以int **p4的跨度位8位:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char *p1 = NULL;
printf("p1 = %u\n",p1);
printf("p1+1 = %u\n",p1+1);
short *p2 = NULL;
printf("p2 = %u\n",p2);
printf("p2+2 = %u\n",p2+1);
int *p3 = NULL;
printf("p3 = %u\n",p3);
printf("p3+1 = %u\n",p3+1);
char **p4 = NULL;
printf("p4 = %u\n",p4);
printf("p4+1 = %u\n",p4+1);
int **p5 = NULL;
printf("p5 = %u\n",p5);
printf("p5+1 = %u\n",p5+1);
return 0;
}
~
运行结果:
p1 = 0
p1+1 = 1
p2 = 0
p2+2 = 2
p3 = 0
p3+1 = 4
p4 = 0
p4+1 = 8
p5 = 0
p5+1 = 8
指针变量的取值宽度:指针变量 指向的类型决定
混合使用指针,取地址。
例子:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int addr = 0x11223344;
char *p1;
p1 = &addr;
printf("p1+3 = %#x\n",*(p1+3));
short *p2;
p2 = &addr;
printf("p2+1 = %#x\n",*(p2+1));
int *p = &addr;//这里理解为p=&addr;而不是*p=&addr.
printf("P=%#x\n",*(p));
char *p3 = &addr;
p3 = p3+1;
printf("p3 = %#x\n",*(short *)p3);
return 0;
}
p1+3 = 0x11
p2+1 = 0x1122
P=0x11223344
p3 = 0x2233
指针使用时应注意:
1
//不要操作未初始化的指针变量
//p1保存的是一个随机地址 容易访问非法内容 造成段错误
int *p1;
printf("*p1 = %d\n", *p1);//段错误
2
//不要操作 初始化 为NULL的指针变量
int *p2 = NULL;
printf("*p2 = %d\n", *p2);//段错误
3
//不要给指针变量赋 无意义的数值
int *p3 = 2000;
printf("*p3 = %d\n", *p3);//段错误
4
//不要操作越界的空间
int data = 100;
int *p4 = &data;
p4 = p4+1;
printf("*p4 = %d\n", *p4);//非法操作
5
//万能指针可以保存任意类型的地址
void *p;
int num = 10;
p = #
//不能直接操作万能指针范围所存储的空间对应的内容
printf("*p = %d\n", *p);//err 不能使用*p
//必须对万能指针 强制类型转换才能取对应空间的内容
printf("*p = %d\n", *(int *)p);
6
//void 不能用于定义变量
//void num;//err