指针是什么?
指针是内存中一个最小单元的编号,也就是地址
平时口语中说的指针,是指指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中的指针通常是指针变量
我们为每个内存单元编了一个号,这就是内存单元的地址
一个小的内存单元是一个字节
32位机器生成32位的地址,通过地址线传输来定位内存单元
64位机器生成64位的地址,通过地址线传输来定位内存单元
这么说的话,以32位为例:
我们就有2^32个内存地址,就可以访问2^32个内存单元,也就是4GB
那64位机器按理说就是可以访问4GB*2^32的内存
但目前内存最大也就32G
指针变量:我们使用&取出变量的内存起始地址,把地址放到一个变量中,这个变量就是指针变量
(就是存放地址的变量)
在32位机器下,地址是32位,所以一个指针变量应该是4个字节
在64位机器下,地址是64位,所以一个指针变量应该是8个字节
int a=10;
int *pa=&a;
总结:
- 指针是用来存放地址的,地址是唯一标识一块地址空间的
- 指针再32为平台下是4个字节,在64位平台下是8个字节
指针和指针类型
首先我们要知道指针类型无法决定指针大小,指针大小是平台决定的
要么4字节,要么8字节
指针类型到底有什么用处??
看段代码:
int main()
{
int a=0x11223344;
int *pa=&a;
*pa=0;
return 0;
}
调试我们看到a中有了我们放入的数据
当我们执行*pa=0时,a里的数据4个字节变成了全0
我们下面把指针类型换一下,从int*换成char*
int main()
{
int a=0x11223344;
char *pa=&a;
*pa=0;
return 0;
}
我们发现执行*pa=0时只改了1个字节
两次代码只有指针类型变化了,由此我们看出
指针类型决定了指针在被解引用的时候的访问权限
整型指针解引用访问4个字节
字符指针解引用访问1个字节
.......
指针类型还有一个作用
看段代码:
int main()
{
int a = 10;
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);
printf("%p\n", pc);
printf("%p\n", pa+1);
printf("%p\n", pc+1);
return 0;
}
我们发现int *指针+1跳了4个字节,char *指针+1跳了1个字节
我们可以这样理解:
对于整型指针,站在其角度就认为其访问的是一个int,+1就是跳到下一个int
对于字符指针,站在其角度就认为其访问的是一个char,+1就是跳到下一个char
int * +1-------+1sizeof(int)字节
char * +1 -----+1*sizeof(char)字节
int * +n ------n*sizeof(int)字节
.......
所以指针类型决定了指针向前或者向后走一步,走多大距离
指针类型总的来说决定了我们看待内存的视角
看个代码:
int main
{
int arr[10]={0};
//如果希望一一个整形形式访问,循环10次就行
int *p=arr;
for(i=0;i<10;i++)
{
*P=0x11223344;
p++;
}
}
int main
{
int arr[10]={0};
//如果希望以char形式访问,循环次40次就行
char *p=(char*)arr;
for(i=0;i<40;i++)
{
*P='x';
p++;
}
}
可以通过调试观察
补充前面数组的知识
不管是二维还是一维数组,在传参的时候,都不会去创建数组
所以数组的大小不需要明确指定
一维数组传参的时候,形参的数组大小可以省略
二维数组传参的时候,形参的数组中,行可以省略,列不可以省略