int a;
变量类型 只有知道变量的类型,系统才知道为它分配多少字节的存储空间
变量名 给变量取一个名字,后面我们要访问这个变量可以通过这个名字对他访问
变量的值(右值) 变量名对应的存储空间中存储的内容
变量的地址 用来保存这个变量值的那个存储空间的编号
-》在c语言中,每个变量名都有两层含义
int a;
a = 100; 把100存放到a对应的那个地址中去 :左值
printf("a=%d\n",a); 把a对应的那个地址中的值取出来,并打印 :右值
int b = a;//把a对应的那个地址中的值取出来,赋值给b :右值
(1)代表该变量的存储单元地址:左值
(2)代表该变量的值:右值
对一个变量的访问,只有两种情况:
一是把一个值(存到)写到该变量的地址中去 write
二是从该变量的地址中取值 read
两种情况,都和该变量的地址相关
由此:如果我们知道了一个变量的地址,是不是就可以通过该地址去访问这个变量呢?
指针
2,什么是指针?
地址:分配给每个变量的内存单元都有一个编号,这个编号就是我们说的地址。
在内存中,这个编号是以字节为单位来编号的。
就像一个大酒店,每个房间都有一个编号,我们我们可以通过这个房间号去找到相对应的房间一样
我们也可以通过对应的地址编号去找到对应的地址
可以认为指针就是一个地址编号。一个变量的地址,我们也称之为变量的“指针”
要通过一个对象的地址(指针)来访问这个对象,我们首先得保存这个对象的地址
int a = 10;
?=&a;
我们保存一个整数,是用int型的变量来保存的,
现在是要保存一个地址(指针),用什么变量呢?-》指针变量
3,指针变量
目录
1,问题的引入
2,什么是指针?
3,指针变量
4,两种与指针有关的运算符
指针变量也是一个变量,只不过他是用来保存指针的而已
int a = 10;
? = &a;
需要定义一个指针变量来保存a的地址,假设?已经保存了a的地址,那么我们说?指向了a
该怎么定义这个变量呢?
指向的那个变量的类型 * 变量名;
我想指向a,a的类型是int
所以: int *p; //int * p;->*和p之间有无空格都可以
int *p;//定义了一个变量,变量名字叫做p,变量的类型是int * 。一般就把p称之为int型的指针变量
//定义了一个变量,变量名字叫做*P,它的类型是int《-错误的 ,*p符合标识符的规定吗?
例子:
int a = 10;
要定义一个变量来保存a的地址
int * p;
怎么保存a的地址
p=&a;
其实变量的地址是可以打印的,%p
系统会给所有的变量分配存储空间,那么变量p也不例外,那么是分配多少个字节呢?
sizeof(p);通过打印知道是占4个字节
char c = 'h';
char * q = &c;//等价 char * q; q = &c;
sizeof(q);
指针变量占多少个字节,由寻址范围决定,也就是说在32位机器上,
不管是什么类型的指针,都是4个字节
2^32 -> 2^10 * 2^10 * 2^10 * 4 ->4GB
4,两种与指针有关的运算符
&(取地址符):单目运算符
&对象
取这个对象(变量,数组,函数)的地址
&a ->对象a的地址
*(指向运算符):
*地址 <->地址对应的那个对象
*(&a) -> *(a的地址) -> 地址对应的那个对象 ->a
*(&a) <-> a
*& 约掉,编译器帮你约掉
-----------------------------------------------
int a = 5;
int * p;
p = &a;
*p = 10;//*p <-> *(&a) <-> a//其实就是a = 10;
printf("a=%d\n",a);//10
p = &a;和*p = 10;中的p分别是左值还是右值
p = &a; //把a的地址&a存入到p的存储空间中去 -》左值
*p = 10;//假设是左值,也就是p的地址,*(&p) -> p
//*p = 10等价于 p=10 明显是错的
所以是右值,也就是p的值,就是a的地址
5,指针变量作为函数参数
void f(int * p)
{
.......
}
void ff(int p)
{
.......
}
main()
{
int a = 0;
f(&a);
ff(a);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)