其他分享
首页 > 其他分享> > 谁说五分钟不能看明白C语言的指针?

谁说五分钟不能看明白C语言的指针?

作者:互联网

本文会非常简单地说明指针是在干嘛,什么时候用,怎么去用,不会涉及复杂的&*()混搭最后问类型的奇怪例子。

指针是在干嘛

举个简单的例子:

指针什么时候用

  1. 函数传参用指针有三个好处

    1. 性能更好。可以理解为,别人向你要某个盒子里装的的大笨书的内容,但那个书很大很厚,复印一件的话费时费力,于是你选择给了一个编号,谁要看的话自己去这个地方查。这个编号就是指针。
      void printLargeObject(LargeObject *l)
      {
      	//在函数内不会复制出一个LargeObject,
      	//而是通过指针l直接访问对应的空间
      	//...
      }
      
    2. 类型更灵活。本来,别人需要告诉我们,他要的是哪类书,不是这类书不要。但现在呢,你可以只给一个位置,类型不重要,是不是需要的那一类书,谁要的谁自己去判断。这个就是C++多态思想的雏形,在C语言中涉及函数指针的参数偏多,这里略过。
    3. 可以直接改掉原本的数据。本来,别人拿到的是复印件,在复印件上勾勾画画,不影响原件,现在你给了他原件的位置,他就可以在原件上勾勾画画,虽然增大了风险,但也更方便了。
      void AddOne(int *a)
      {
      	*a = *a + 1; //函数外面传入的a指向的整数被加了1
      }
      
  2. 排序交换用指针的好处,不言而喻,性能好,还是两本大笨书,要交换位置得抱出来,再放进另一个位置去,中间还得有个桌子暂时搁一下这两本书。现在呢,只需要交换写着两本书位置的小纸条,一下子轻松了很多。

    void swap(void* a, void* b){
    	void* temp = a;
    	a = b;
    	b = temp;
    }
    
  3. 通过一个地址,不只可以找到这一个小盒子,还可以找到后面的n个小盒子,这样就给我们提供了极大的方便,这n个小盒子里面可以放任何东西,可以放整数,可以放浮点数,也可以放其他变量的地址,而且空间可以很大很大,极大地提高了灵活性。

    int* arrptr = (int*)malloc(10 * sizeof(int));
    arrptr[0] = 0; //像数组一样使用
    arrptr[9] = 9; 
    
  4. 有些地方不得不用,例如qsort函数的比较函数,人家都要求用了,你想偷懒直接调函数,自然就得学会怎么用指针。例子见:

    手把手,最详细 | C语言调用qsort函数对struct结构体排序

指针怎么去用

  1. 理解指针的类型:指针用type *来表示,type为C语言中的类型:例如,int,float,void,char,也可以是自己定义的结构体类型等。定义一个int* a = NULL,就是创建了一个指向整数的int*变量。int*的含义是内部存储的值是一个地址,并且访问地址中的数据的方式是按int访问。
  2. 理解指针的访问:上面的a,就代表一个地址,而*a,就是访问其中的值。
  3. 理解地址的含义:之前学过,如果定义了一个int b,那么&b就代表b的地址,所以可以把&b赋值给指针d:int* d = &b
  4. 理解结构体指针的访问:结构体指针访问其属性,可以用箭头:c->num,相当于(*c).num
  5. 理解指针和数组的关系:
    数组 到 指针数组的变量名即为这一段空间的起始地址,也可以把这个值赋给一个指针。
    int arr[10];
    int * arrptr = arr;
    
    指针 到 数组指针指向了一片已开辟的空间,可以像数组一样来使用。
    int* arrptr = (int*)malloc(10 * sizeof(int));
    arrptr[0] = 0; //像数组一样使用
    arrptr[9] = 9; 
    arrptr[10] = 10; //访问越界
    free(arrptr);
    

标签:盒子,int,void,地址,C语言,五分钟,arrptr,指针
来源: https://blog.csdn.net/weixin_43997331/article/details/122750674