010 指针基础篇——“C”
前言
小留言:哈喽!来自CSDN的朋友们,本文是Fan——C语言学习之路的第9篇文章,希望我的文章可以给您带来一定的帮助!
什么是指针
指针是一个值为内存地址的变量。 平常口语中说的指针,其实是指针变量,指针变量是存放地址的变量。int main()
{
int a = 1;
int* pa = &a;
*pa = 10;
return 0;
}
这里也可以观察到pa的值与&a的值相同,也就是pa的值为变量a的地址
而&pa是指针变量的地址,这里要注意区分。
(int)类型说明符表明了指针所指向的对象的类型,*表明声名的变量是一个指针变量。pa是一个指针,*pa指向的是int类型的数据。
指针的大小:指针在32位平台上是4个字节,在64位平台上是8个字节
指针与指针类型
指针类型决定了指针进行+1或-1操作的时候一步走多远
int main()
{
int a = 10;
char b = 'B';
int* pa = &a;
char* pb = &b;
printf("%p\n", pb);
printf("%p\n", pb + 1);
printf("%p\n", pa);
printf("%p\n", pa+1);
}
可以观察到,char类型一次跳过1个字节,而int类型一次跳过4个字节,这是由指针指向的数据类型所决定的。而非指针本身的字节数。
野指针
最常见的野指针是我们在定义指针的时候并未初始化
而野指针会给我们带来以下危害
程序崩溃:野指针指向的内存地址可能已经被其他程序或系统使用,如果程序试图访问这个地址上的数据,就会导致程序崩溃或者产生不可预知的结果。
数据损坏:野指针指向的内存地址可能已经被释放,如果程序试图在这个地址上写入数据,就会导致数据损坏。
安全漏洞:野指针可能被黑客利用,攻击者可以通过修改野指针指向的内存地址,来改变程序的行为或者获取敏感信息。
以下是常见的野指针问题
1、指针未初始化
int main()
{
int* p;
*p = 20;
return 0;
}
析:就好比指针p(一个人)随意地找到一个停车位。但是呢这个停车位是专用的。p(解引用)直接又把专用停车位的警示牌给扔了,然后p = 20,即又把20(他自己的车)停了进去。
这里最大的问题不在于int* p,而是去解引用一个不属于程序的空间!
2、局部变量出了函数作用域就会销毁
int* test()
{
int a = 10;
return &a; //a是局部变量随着程序而销毁
}
int main()
{
int* p = test(); //接收a的地址,虽然指针p记录着这一块空间,但是已经不属于当前程序了,非法访问
*p = 100;
return 0;
}
指针p接收了a的地址,用指针p记录这一块空间,但是这一块地址已经不属于当前程序了,解引用时造成非法访问。
析:好比男女朋友分手后,保留着电话(这没问题即:用指针p记录a的地址),但是再打电话去骚扰对方(解引用并修改值)这就有大问题了。
指针运算
1、指针±整数 == 指针
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
int len = my_strlen("abcdef");
printf("%d", len);
return 0;
}
这里利用指针达到计算字符串里字符个数,指针+1还是一个指针,只是这个指针指向下一个地址
2、指针±指针 == 整数
int my_strlen(char* str)
{
char* start = str; //记录字符串首字符即起始位置
while (*str != '\0') //当指针str指向'\0'结束
str++;
return str - start;
}
int main()
{
int len = my_strlen("abcdef");
printf("%d", len);
return 0;
}
小结
倘若本文有遗漏疏忽之处,还需要你指正,以便今后改进!祝你天天开心啦!欢迎到我的博客留言,我会尽力解答,希望能给你一些帮助!