小言_互联网的博客

初阶指针C

345人阅读  评论(0)

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰指针是什么

🐰指针和指针类型

🌸指针+-整数

🌸指针的解引用

🐰野指针

🌸野指针的成因

🌸如何规避野指针

🐰指针运算

🌸指针+-整数

🌸指针-指针

🌸指针的关系运算

🐰指针和数组

🐰二级指针

🐰指针数组


🐰指针是什么

1.指针是内存中一个最小单元的编号,也就是地址

2.平时口语上所说的指针,通常指的是指针变量,是用来存放地址的变量

3.把内存划分为一个个的内存单元,这个内存单元大小是1字节,从概念上讲:编号 == 地址 == 指针

指针变量:

我们可以通过& (取地址操作符) 取出变量的内存起始地址,把地址可以存放到一个变量中,这个变量就是指针变量


   
  1. int main
  2. {
  3. int a= 10; //a是整形,占用4个字节的内存空间,没个字节都有对应的空间
  4. int* pa=&a; //&a 得到的是a的地址(指针),其实得到的是a所占内存中4字节中第一个字节的地址;pa是指针变量
  5. }

‼️注:指针变量是用来存放地址的,存在指针中的值都会被当作地址,(锤子的眼里都是钉子)

🐰指针和指针类型

指针的类型为一个类型名和字符“ * ” 的组合,我们平时说“一个int 类型的指针”,其实是在说“一个类型为 int*的指针”。编译器认为这样的一个指针指向的内存单元为4 字节,并将其内容解释为 int 类型的值。

指针的类型有很多种,但指针类型大小是相同的:


   
  1. printf( "%lu\n", sizeof( int*));
  2. printf( "%lu\n", sizeof( char*));
  3. printf( "%lu\n", sizeof( double*));
  4. printf( "%lu\n", sizeof( short*));
  5. 他们所打印的值都是,都是 8

‼️注:不同类型的指针大小相同,x86环境下大小是8,x64环境下大小是4

🌸指针+-整数


   
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a= 10;
  5. int* pa=&a;
  6. char* pc=&a;
  7. printf( "%p\n",&a);
  8. printf( "%p\n",pa+ 1);
  9. printf( "%p\n",pc+ 1);
  10. return 0;
  11. }

其运行结果为:

0x7ffeefbff3e8

0x7ffeefbff3ec

0x7ffeefbff3e9


   
  1. &a: 0x7ffeefbff3e8
  2. pa+ 1 0x7ffeefbff3ec
  3. ppc+ 1 0x7ffeefbff3e9
  4. 可以看出来pa+ 1移动了 4个内存单元即 4个字节,而pc+ 1移动了 1个内存单元即一个字节,因为pa是 int类型的指针变量,所以需要移动 1* sizeof( int),pc是 char类型的指针变量,所以需要移动 1* sizeof( char).

总结:指针类型决定了,指针进行+1,-1的时候,一步走多远

🌸指针的解引用


   
  1. #include<stdio.h>
  2. int main(){
  3. int a= 1000,b= 1000;;
  4. int* pa=&a;
  5. *pa= 20;
  6. char* pb=&b;
  7. *pb= 20;
  8. printf( "a=%d b=%d\n",a,b);
  9. }

其运行结果为:

a=20 b=788

大家就会奇怪,明明*pa=20,*pb=20一样,为什么a,b的值不一样呢?分析如下


   
  1. int a= 1000,b= 1000;;
  2. int* pa=&a;
  3. *pa= 20;
  4. char* pb=&b;
  5. *pb= 20;
  6. 因为pa是整形的指针变量,可以访问 4个字节的存储空间,刚好a也是整形变量,pa可以访问a中的所有值,而pb是字符型的指针变量,可以访问 1个字节的存储空间,而b是整形变量,pb只能访问b中一个字节的内容

总结:指针类型就决定了,在解引用指针的时候能访问几个字节

🐰野指针

🌸野指针的成因

定义:野指针就是指针指向的位置是不可知的(随机的、不准确的、没有明确限制的)

(1)指针未初始化

int*p;未初始化

(2)当指针指向的范围超出数组arr的范围时,p就是野指针


   
  1. int arr[ 10]={ 0};
  2. int* p=arr;
  3. *(p+ 10)= 1;*(p+ 10)就是arr[ 10],这已经越界了

(3)指针指向空间释放

就是指针p之前指向的是一个有效的内存空间,现在那个空间被销毁了,这个指针p也就成为了野指针(这就好比张三以前有个女朋友,但是现在分手了,张三就成为了单身汪,因此单身汪是不能联系前女友的

(4)避免返回局部变量的地址


   
  1. int* fun(int arr[]){
  2. int* p=arr;
  3. return str
  4. }
  5. int main(){
  6. int arr[ 10]={ 0};
  7. int* parr= fun(arr);这里返回的地址,已经在函数调用完成时销毁了
  8. }

(5)指针的使用之前检查有效性

‼️注:一个指针不知道指向哪里时,暂时可以初始化NULL

🌸如何规避野指针

注意造成野指针的成因,就可以有效避免野指针的形成。

‼️注:一个指针不知道指向哪里时,暂时可以初始化NULL

🐰指针运算

🌸指针+-整数

🌸指针-指针

🌸指针的关系运算

🐰指针和数组

🐰二级指针

🐰指针数组

🐶🐶🐶由于课程问题,有些许内容还没有更新,请各位观众老爷们见谅🐶🐶🐶

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  


转载:https://blog.csdn.net/m0_67846057/article/details/128957292
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场