指针是什么
- 指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。(指针就是变量,用来存放地址的变量)
- 指针是为了存放地址才出现的,地址是为了标识一块地址空间的。
- 指针是让地址有地方存放,指针让内存的访问更加方便。
- 指针的大小:在 32 位平台 4 个字节;64 位平台,8个字节。
指针类型
- 指针类型: type + *
int *pi = NULL;
char *pc = NULL;
float *pf = NULL;
short *ps = NULL;
long *pl = NULL;
int * 类型的指针是为了存放 int 类型变量的地址。
char * 类型的指针是为了存放 char 类型的地址。
…有类型的区分,编码会更加的严谨,也确定了指针运算的规律。
指针运算
- 指针 +- 整数
#include<stdio.h>
int mian()
{
int num = 8;
int *pi = #
char *pc = &(char *)num;
printf("%p\n", &num);
printf("%p\n", pi);
printf("%p\n", pi + 1); //向后4个字节
printf("%p\n", pc);
printf("%p\n", pc - 2); //向前2个字节
system("pause");
return 0;
}
输出结果为:
由输出结果可发现:
指针的类型决定了指针向前或者向后走一步有多大(距离)。
- 指针 - 指针(指针相减)
#include<stdio.h>
int str(char *s)
{
char *p = s;
while (*p !='\0')
{
p++;
}
return p - s; //指针 - 指针
}
int main()
{
char s[] = "123456";
printf("%d\n", str(s));
system("pause");
return 0;
}
程序执行结果:
- 指针的关系运算
指针的比较需要注意:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但是不允许与指向第一个元素之前的那个内存位置的指针比较。 - 指针的解引用
#include<stdio.h>
int main()
{
int num = 0x11223344;
printf("%d\n", num);
int *pi = # //声明并定义一个指针pi
char *pc = (char *)#
*pc = 0x12
printf("%d\n", num);
*pi = 0; //解引用,*解释了 pi 对常量0x11223344的内存地址的引用,解释结果就是去寻找pi所指向的内容,pi指向 num,所以num的内容会被修改为0
printf("%d\n", num);
system("pause");
return 0;
}
程序执行结果为:
地址(未改变):
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字符)。
例如:
char * 的指针解引用就只能访问一个字节,而 int * 的指针的解引用可以访问四个字节。
二级指针
- 指针变量也是变量,那么它就有地址,指针变量的地址存放在哪里?–二级指针
指针表达式解析
- 指针在表达式中可以做左值,也可以做右值。
左值:变量名对应存储空间;
右值:变量名表示该变量对应内容。例:
cp; //变量,可做左值,也可做右值
&cp; //地址变量,不可做左值,可做右值
*cp + 1; //不可做左值,可做右值
*(cp + 1); //cp之后的一块空间,可做左值,也可做右值
++cp; //前置++,不可做左值,可做右值
cp++; //后置++,不可做左值,可做右值
*++cp; //可做左值,也可做右值
*cp++; //可做左值,也可做右值
++*cp; //*cp前置++,不可做左值,可做右值
(*cp)++; //不可做左值,可做右值
++*++cp; //对cp下一块空间的内容前置++,不可做左值,可做右值
++*cp++; //对cp内容前置++,对cp后置++,不可做左值,可做右值
表达式的左值必须是要可修改的(变量),可以参考词条判断其可以作为左值或是右值。