1、对于已定义的某个变量的读取:通过该变量来访问它的值;通过该变量的存储位置读取数值(指针)。操作系统会将所有的内存单元进行编号。
关于32位操作系统与64位操作系统支持的最大内存。计算机底层使用二进制进行管理,所以32位操作系统支持2的32次方个编号,即4G的内存地址。
int a=1;
int b=2;
若:对于数值1,其在内存上的编码地址为0x00010001;数值2的内存编码地址为0x00010003;a的内存编码地址为0x00010004;b为0x00010007。
则0x00010001 和0x00010003这个两个内存编号就是指针。
在编程中,通过变量a/b来获取变量值得读取方式称为“直接访问”;二程序通过内存编码地址先找到对应编码的内存单元,在从内存编码单元上读取数值的方式为“简介访问”。
变量的内存地址就是该变量的指针,而用于保存该内存地址的变量就是指针变量(即a和b)。
2、关于指针的使用
&:取地址运算符---后面紧跟变量,用以读取该变量所在的内存地址;
*:后面紧跟一个指针变量,用以读取该指针变量对应的变量
int a=200//定义一个int类型的变量
int*p;//定义一个指向int变量的指针
p=&a;//将a变量的内存地址赋值给p这个指针变量的值
NSlog(@"%d",*p);//*p表示取出指针p对应的变量,即200;
NSlog(@"%d",a==(*(&a)));//取出a的指针,然后将a的指针进行反向取出,得到200;
指针变量本身也是一种变量,只是其变量存放的值不同,只能用以存放其他变量的内存地址:
定义指针变量时,必须使用*来标示定义的指针变量;
C语言是强类型语言,使用指针变量之前必须对其进行声明。而且一旦声明了该指针变量的类型后,该指针变量就只能指向对应类型的变量。如int*p只能执行int类型数值的指针;double*q同理。
3.
void swap(int*p1,int*p2){
int tem=*p1;
*p1=*p2;
*p2=tem;
p1=p2=nil;
}
int main(int argc,char*argv[]){
@autoreleasepool{
int a=5;
int b=3;
int*p1=&a;
int*p2=&b;
swap(p1,p2);
}
}
关于该段代码运行的结果:a和b的数值进行了替换,但是p1和p2的数值并没有发生变化,所以说明在进行运算时只是将指针的副本进行了传递,并没有对指针本身进行传递和修改。