指针
1.什么是地址
- 程序中的数据不仅能存储在简单的变量中,还能存储在复杂的变量(例如:数组)
- 而程序中的数据要存储,就要占用特定的内存空间,即某一类型的对象在内存中要有相应的位置,即地址。(就是数据要存储就一定要有地方存放自己的空间,类似家的感觉,一个数据对应一个家,家所在的地方就是地址)
- 为了更清楚地说明地址和指针的概念,下面介绍了左值的概念。
2.左值
-
什么是左值
- 任何一个指向能寻找出数据内存位置的表达式都可称为左值(例:简单变量就是左值),像x=12.5这样,“=”左边的x就叫左值。
- 指定数组元素的选择表达式也是左值,像arr[3]=4,“=”左边的也是左值。
-
C语言中很多内容不是左值,看书的我目前只知两点
- 常量不是左值。
- 算术表达式的值也不是左值。
-
左值的几个原则
- (1)每个左值都存储在内存中,内存的每个字节都按顺序有一个相应的编号,相邻字节的编号相邻。内存的编号称为地址,因此,每一个左值都有其对应内存地址。
- (2)只要声明了左值,尽管左值的内容会变(如"="右边的数值),但是地址是不会变的。
- (3)不同类型的左值占用不同大小的内存,例如(short int短整型占2字节,而int整型占4字节)
- (4)左值的地址本身也是数据,也可以在内存中进行操作和存储。(**下面我来尝试进行说明第四点原则的意思)
3.关于左值的第四个原则
- 首先,上图,图下进行说明,对后面指针的概念或许有点帮助
-
定义一个 int a,众所周知a占四个字节,所以就如图(a)一样,分别占用了2000、2001、2002、2003。
-
根据原则(4),a的首地址2000本身也是一个整型数据,所以2000也可以被存储在内存中,即2000也拥有自己的地址,如图(b),2000占用了4个字节,分别是3504、3505、3506、3507。
一.指针变量
1.声明指针变量
- 声明指针的格式:base-type *pointer-variable;
- 其中base-type代表指针所指向对象的类型就是(“=”右边定义的类型),pointer-variable就是指针变量的名字。
- 例:int *p;(这是整型的指针变量)
int p2;(这是个普通整型变量)
2.指针变量的赋值
- 使用之前不需要定义,且必须赋给具体的值,未赋值无法使用。
- 给指针变量的赋值是赋值到地址上的。
- 首先变量的赋值格式如下:
int a;
int *p=&a
其中,a表示一个变量,&a表示变量a的地址,int (*p) = &a就表示把a的
地址赋给了p,把&a地址上的值赋值给了(*p)
举个例子:下面给段代码看看运行结果
#include<stdio.h>
#include<stdlib.h>
int main(){
int pa,pb; //普通变量
int *ipointer_pa,*ipointer_pb;//声明两个指针变量
scanf("%d%d",&pa,&pb); //输入两个数
ipointer_pa=&pa; //将变量pa的地址赋值给指针变量ipointer_pa,下面同理
ipointer_pb=&pb;
printf("*ipointer_pa=%x,*ipointer_pb=%x",ipointer_pa,ipointer_pb); //输出指针变量的地址
printf("*ipointer_pa=%d,*ipointer_pb=%d",*ipointer_pa,*ipointer_pb); //输出指针变量的值
system("pause");
return 0;
}
结果:
其中ipointer_pa,ipointer_pb输出了地址,带上星号就输出了值
就是这样啦,休息休息,明天继续总结