一、此次学习小结
1.指针
1.1指针是内存中最小单元的编号,也就是地址
1.2平时我们说的指针是指指针变量,用来存放地址的变量
1.3指针变量:通过&取地址操作符将变量的地址取出来,放在一个变量中,这个变量就是指针变量
一个内存单元是一个字节的大小,一个指针指向一个字节
在32位机器中,有32根地址线,会产生高电平和低电平,也就是(0/1)。就会有2的32次方个地址,存放2的32次方个字节,算下来也就是4GB的内存大小
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以 一个指针变量的大小就应该是4个字节。 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地 址。
总结: 指针变量是用来存放地址的,地址是唯一标示一个内存单元的。 指针的大小在32位平台是4个字节,在64位平台是8个字节。
2.指针类型
指针的前面用的什么类型,就是什么类型的指针
char *pc = NULL; 存放char类型变量的地址
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
2.1指针类型决定了,对指针解引用时,所访问的内存空间大小是多少
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
char*是1字节
int*是4字节
double*是8字节
2.2指针的类型决定了步长的大小(向前,后),也就是基指针变量+1,是跨过几个字节
int*+1是跳过一个int型,也就是4个字节的大小
char*+是跳过一个char型,也即是1个字节的大小
3.野指针
我的理解:指向不明确的指针变量
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针的成因:
3.1指针未初始化
3.2指针越界访问
int arr[] = { 1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
for(int i = 0;i<=sz;i++)
/**p = 20;int* p;*/
printf("%d\n", arr[i]);
3.33. 指针指向的空间释放
3.4如何规避野指针
3.4.1指针初始化
3.4.2小心指针越界
3.4.3指针指向空间释放及时置NULL
3.4.4避免返回局部变量的地址(因为局部变量出函数后销毁,及时知道地址,也找不回地址里存放的内容了。
3.4.5指针使用前检验其有效性
if(p!=NULL)
*p = 20;
4.指针的运算
指针+-整数
int main()
{
int p[4] = { 0 };
int* arr = p;
for (int i = 0; i < 4; i++)
{
printf("%d ", *(arr + i));
}
return 0;
}
指针+-指针
指针的关系运算
#define a 4
int main()
{
float arr[a] = { 0 };
float* vp;
for (vp = &arr[0]; vp < &arr[a];)
{
*vp++ = 0;
}
for (vp = &arr[a]; vp >= &arr[0]; vp--)
{
*vp = 0;
}
return 0;
}
标准规定: 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较
5.指针和数组
数组名就是首元素的地址,(除了两种情况,sizeof(数组名),数组名+1时)
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i<sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
6.二级指针
7.指针数组
存放指针的数组
int* arr[] 整型数组
char* arr[] 字符数组
二、此次学习收货
感受:
本次我学习了指针的一些相关的概念,以及指针的一些运算。感觉更加了解指针了。收获也是很多的