1、指针是什么?
指针也是一个变量,变量里存的是一个整数,存的是内存中的地址;可以把内存想象为一个大走廊,走廊边有好多房间,每个方间一个字节大小,每个房间有一个门牌号,这个门牌号就是地址,门牌号(地址)从0开始,依次累加。
#include<stdio.h>
int main()
{
int num=10;
int* p=#
printf("%d\n",*p);//间接访问;解引用
printf("%d\n",num);
return 0;
}
2、知识点
int*
是一个整体,构成了int*
的类型,int*
和int ,double,float内置类型都是并列的关系,char*
,double*
,float*
也是指针类型的变量,指针其实是一组类型的统称。*p
和num是等价的,通过*p
来修改内存的内容,再访问num就会感知到修改。
3、知识点
32 位系统上,指针变量占4个字节
64位系统上,指针变量占8个字节
操作系统分成32位和64位
应用程序也分为32位和64位
32位系统上可以运行32位程序
windows系统上既可以运行32位程序,也能运行64位程序
VS上默认位32位程序,如果要生成64位要切换成x64模式
4、大端模式与小端模式
11 22 33 44大端字节序
44 33 22 11小端字节序(我的机器)
举个例子,比如数字0x12 34 56 78在内存中的表现形式为:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
可见,大端模式和字符串的存储模式类似。
5、空指针:
地址值为0 的指针,(0x100)解引用空指针,程序崩溃
一定要访问合法内存(已经申请到的内存是合法内存,未申请到的内存是非法的内存),不能访问非法内存
6、野指针:
如果指针变量里保存的地址对应到一个非法的内存,我们就指这样的指针为野指针,对野指针解引用,是一种未定义行为,空指针是一种特殊的野指针。
例1:写一个函数打印arr数组的内容,不使用数组下标,使用指针。
方法1:
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int *p=&arr[0],i=1;
for (i=1;i<=sizeof(arr)/4;i++)
{
printf("%d ",*p);
*p+=1;
}
printf("\n");
return 0;
}
方法2:
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
int *p = arr;
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
return 0;
}
例2:下面代码输出的结果是什么?
#include<stdio.h>
int main()
{
int a = 0x11223344;//大端模式,int为4个字节,由低到高:0x11、0x22、0x33、0x44
char *pc = (char*)&a;//char为一个字节
*pc = 0;//最高的一个字节置为0,即0x11223300
printf("%x\n", a);
return 0;
}
输出结果为: 11223300
例3:下面代码的输出结果是什么?
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
short *p = (short*)arr;//short类型占2个字节
int i = 0;
for(i=0; i<4; i++)
{
*(p+i) = 0;//前4个字节被赋值为0,相当于数组中的前两个数被赋值为0
}
for(i=0; i<5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
输出结果为: 0 0 3 4 5