目录
🌹前言:C语言的指针真是一个非常神奇而又奇妙的东西,它可以使我们编程时更加的方便快捷,却又可能让我们在它面前找上那么几个小时,去寻找它的错误。如果指针掌握的熟练程度不够,那么我们用起来指针,很可能会码出很多我们不知道的bug,而熟练掌握了指针,就会让我们在C语言的道路上充满捷径,如鱼得水。
🆚1.什么是指针
#include <stdio.h>
int main()
{
int a = 10;//在内存中开辟一块空间
int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
//将a的地址存放在p变量中,p就是一个之指针变量。
return 0;
}
2. 指针和指针类型
char *pc = NULL;int *pi = NULL;short *ps = NULL;long *pl = NULL;float *pf = NULL;double *pd = NULL;
(1)指针+-整数
int main(){int n = 10;char *pc = (char*)&n;int *pi = &n;printf("%p\n", &n);printf("%p\n", pc);printf("%p\n", pc+1);printf("%p\n", pi);printf("%p\n", pi+1);return 0;}
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
(2)指针的解引用
int main()
{
int n = 0x11223344;
char* pc = (char*)&n;
int* pi = &n;
*pc = 0;
*pi = 0;
return 0;
}
char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用能访问四个字节。
3. 野指针
(1)野指针成因
int main()
{
int* p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i <= 11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
int* test(){int a = 10;return &a;}int main(){int* p = test();*p = 20;return 0;}
(2)如何规避野指针
int main()
{
int* p = NULL;
//....
int a = 10;
p = &a;
if (p != NULL)
{
*p = 20;
}
return 0;
}
4. 指针运算
(1)指针+-整数
#define N_VALUES 5float values[N_VALUES];float *vp;//指针+-整数;指针的关系运算for (vp = &values[0]; vp < &values[N_VALUES];){*vp++ = 0;}
(2)指针-指针
int my_strlen(char *s){char *p = s;while(*p != '\0' )p++;return p-s;}
(3)指针的关系运算
for(vp = &values[N_VALUES]; vp > &values[0];){*--vp = 0;}
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--){*vp = 0;}
5. 指针和数组
int arr[10] = { 0 };printf("%p\n", arr);
for(i=0; i<sz; i++){printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p+i);}其中p+i就是arr[i]的地址,*(p+i) = arr[i]
6. 二级指针
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;//ppa就是一个二级指针
**ppa = 20;
printf("%d\n", a);
//int*** pppa = &ppa;//pppa就是三级指针return 0;
}
int b = 20;*ppa = &b;//等价于 pa = &b;
**ppa = 30;//等价于*pa = 30;//等价于a = 30;
🎆7. 指针数组
![](https://i-blog.csdnimg.cn/blog_migrate/5e99a5190c2d77cda3dd59763d9e5bf5.webp?x-image-process=image/format,png)
这只是指针的一部分,我们对于指针的学习可还没有结束哦。
最后还是求个赞┗|`O′|┛ 嗷~~🍭