A.指针概念:
(维基百科)在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能用到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象的称为“指针”,意思是通过它能找到以它为地址的内存单元。
#include<stdio.h>
int main()
{
int a = 10;
int *p = &a;//使用&操作符,对变量a取出它的地址
//p变量存储a的地址,p就是一个指针变量
return 0;
}
通俗来讲,指针就是一个变量用来存储地址的变量。
B.指针的作用:
1.指针是存放地址的,地址是为了标识一块地址空间
2.因为指针存放地址,内存的访问因此更加的便利
C.指针的大小:
在32位平台是4个字节,在64位平台是8个字节。
指针的类型:
type+* 。例如char* 类型的指针是为了存放char类型的变量
指针的运算:
1.指针加减整数
int main()
{
int n = 10;
char *p = (char*)&n;
int *pp = &n;
printf("%p\n", &n);
printf("%p\n", p);
printf("%p\n", p+1);
printf("%p\n", pp);
printf("%p\n", pp+1);
system("pause");
return 0;
}
运行结果为:
由此可知指针类型决定了指针移动的字节数,char类型指针移动一个字节,int类型指针移动4个字节etc.
2.指针的解引用
int main()
{
int a = 0x11223344;
char* p = &a;
/*int* p = &a;*/
*p = 0;
return 0;
}
运行观察p内存变化为:
int main()
{
int a = 0x11223344;
int* p = &a;
*p = 0;
return 0;
}
运行结果为:
所以指针的类型决定了对指针的解引用可以操作几个字节。char类型是一个字节,int类型是四个字节。
D.二级指针:指向一级指针的地址
指针表达式解析
char ch = 'a';
char *cp = &ch;
E.判断下面代码是否可以做左值,右值?
左值:空间,右值:内容。
该代码表示cp存储ch的地址,ch内容为‘a’。
&ch: &ch是地址常量,不能做左值,可以做右值
cp:cp是变量,可以做左值也可做右值
&cp:&cp是地址常量,不能做左值,可以做右值
*cp+1:*cp+1表达式是常量,常量‘b’,不能做左值,但是可以做右值
*(cp+1):*(cp+1)表示ch之后的一块空间,可以做左值也可以做右值
++cp:c语言中的变量前置++不能作为左值,可以做右值(c++可以)
cp++:c语言中的变量前置++不能作为左值,可以做右值(c++不可以)
*++cp: 是ch的下一块空间,可以做左值,也可以做右值(++优先级比*高)
*cp++:可以做左值也可以做右值
++*cp:不能做左值,可以做右值(b)
(*cp)++:不能做左值,可以做右值(a)
++*++cp:不能做左值,可以做右值
++*cp++:不能做左值,可以做右值(b)