首先我们要明白,我们电脑CPU在读取数据时候是从内存中读取,处理完之后也会放回内存当中。
内存内部空间划分城一个个内存单元,每个内存大小是一个字节(byte),1个字节等于8个比特位。
就像学校的宿舍一样存在很多楼层,每个楼层内部又有很多独立的小房间,而每个房间最多可以容纳8个人。而指针就是门牌号,可以让CPU精准的读取要访问的内存空间,指针也可以叫地址。这里可以这么说 “内存单元的编号 == 地址 == 指针”。
还需要理解的是32位的机器中有32根地址总线(同理64位的机器有64根地址总线),每根线有2种含义,0或者1,表示是否有电脉冲。32位的机器就是有2^32种表达意思,每一个表达意思表示一个地址。
接下来讲操作符
1,& 取地址操作符
int main()
{
int a=10;
printf("%p\n",&a);
return 0;
}
这里是指取出a的第一个字节的地址,并打印出来。那么&即为访问这个变量的地址空间。
当然,&不仅仅可以访问第一个字节的地址,我们还可以在得到第一个字节的地址的前提下访问这个变量的后续空间并修改它,比如以下
int main()
{
int a=0;
printf("a=%d\n", a);
scanf("%d",&a);
printf("a=%d\n", a);
return 0;
}
从上面的例子我们可以看到&地址还可以修改它内存里面的内容。
指针变量
int*pa=&a;
这里pa就是指针变量,*是在说明pa是一个指针变量,int是指pa在指向一个整型类型的对象。
那么比如有一个char ch=‘w’;要给这个ch设置一个指针变量要怎么写呢?
没错,char*pc=&ch;这里的pc可以是你设定的任何变量名字,我设定为char*pw=&ch;也行。
指针变量的大小。
在32位置机器下:
无论它指向什么类型的变量,char*、int*、short*还是double*等指针变量的大小都是4byte。
同理64位机器也是:为8个字节。8byte。
32位机器:4byte
64位机器:8byte
解引用操作符 *
在设定了指针变量之后,我们可以使用*这个解引用操作符来对设定好的指针变量指向的空间进行修改。
比如
int main()
{
int a=0;
int*p=&a; //*p指向了变量a
*p=4;
printf("%d",a);
return 0;
}
这里我们成功的将a的内容从0改成了4。现在只是简单的讲解一下解引用操作符的使用方法。它在之后有大大用处。
Const
在被const修饰过的变量是无法被直接修改的。
int main()
{
int c=0;
c=10; //这里的c会被修改成10
const int a=0;
a=8; //非法,vs会直接报错
return 0;
}
但是如果我们使用指针,是可以绕开这个const来修改内存空间的内容。
int main()
{
const int a=10;
int* a=20;
printf("a=%d",a);
return 0;
}
这里a会打印出20,也就是通过指针我们可以修改被const修饰过的变量。但是这样不符合我们设定的const规则,那么接下来要讲const 修饰指针变量。
const修饰指针变量
• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本身的内容可变。
int main()
{
int a=10;
const int*p=&a;
*p=20; //非法操作,const修饰下指针指向的内容无法通过指针来改变
p=m; //现在p指向了m的内存空间;
return 0;
}
• const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。
int main()
{
int a=10;
int m=9;
int*const p =&a;
*p=20; //a的内容被改成了20;
p=m; //非法,p在const的修饰下无法改变指向别的内存空间。
return 0;
}
如果左右都加const,则既不能改变指向的内容,也不能修改指针变量指向的内存位置。