暑期实践第四天——Linux下的C语言(指针篇)

今天一天结束了C语言指针的学习,当然对于我们计院专业的学生来说这无疑是一堂查漏补缺课程,即使课程很快,但是一旦认真下来,平复自己的心情,还是会学到不少东西的。

****************************************************************************************************************************************

指针(对今天指针所学内容进行一个大致的概括:):

1.指针定义与使用
2.指针运算
3.指针与数组(一维数组、二维数组)
4.多级指针(指针的指针)  
5.指针数组
6.字符串、字符指针数组
7.指针函数
8.函数指针
9.const与指针
10.void指针

细节概要:

  • 指针的定义与运用:
    • 定义一个指针时,最好初始化p=NULL;​​​​​​,否则指针就会为空,其会随机指向任何地方,有可能会造成严重的影响;
    • 一些重要的指针运用:a=*p+1 取值,值加一

                                                  a=++(*p) 取值,值加一

                                                  a=(*p)++ 取值,值加一
                                                  a= ++*p  取值,值加一

                                                  a= ++(*p)取值,值加一

                                                  a=*p++  取值,指针加一

                                                  a=*++p 指针先加一,取值

                                                  a=*(p+1) 指针先加一,取值

                                                  *(*(a+i)+j) == a[i][j]

  • 指针运算

             1.指针做加1或者减1运算代表指向下一个int类型的数据或者前一个int类型的数据,指针指向的位置是当前地址加上                              sizeof(int),或者当前地址减去sizeof(int)

             2.指针之间可以做减法运算,前提是两个指针类型一致,指向同一数据元素(比如指向同一数组)

                减法的含义代表两个指针之间元素的个数;

  • 指针与数组(一维数组、二维数组
    • *(*(q+i)+j) = a[i][j]
    • *(a+i) = a[i]
    • 指针和数组常见等价操作:(一维数组)
      指针操作    数组操作        说明
      p                 &a[0]            数组首地址
      *p                a[0]              数组的第一个元素
      p+i              &a[i]             数组的第i个元素的地址
      *(p+i)          a[i]                数组的第i个元素
      *p+b           a[0]+b          数组的第一个元素的值加b
      *(p+i)+b      a[i]+b           数组的第i个元素的值加b

      注:当前p指向第i个元素
      *p++          a[i++]      先取得数组的第i个元素的值,i加1//先取得数组的第i个元素的值,指针p再加一,指向a[i+1]
      *++p          a[++i]      先i加1,取得数组的第i+1个元素的值,//指针p先加一,指向a[i+1],再取得数组的第i+1个元素的值  
      *p--          a[i--]      先取得数组的第i个元素的值,i减1//先取得数组的第i个元素的值, 指针p再减一,指向a[i-1]
      *--p          a[--i]      先i减1,取得数组的第i-1个元素的值,//指针p先减一,指向a[i-1],再取得数组的第i-1个元素的值 

    • 二维数组:&a[0][0] ==  a  值一样,含义不一样
                        &a[0][0]表示数组首地址,列地址
                        a表示数组首地址,行地址

  • 多指针(指针的指针级)
    • int **p;
      理论上多级指针最多可以到12级别,实际上2级指针用的多
  • 指针数组
    • int *p[10];
      char *a[20];  
      p是一个指针数组,数组的名字是p,数组有10个元素,每一个元素值都是一个指向整形数据的指针
    • int (*p)[10]的区别,这是一个指针,指针的名字是p,指向一个含有10个元素的整形数组
  • 字符串、字符指针数组
    • C语言本身没有字符串类型,用字符数组来表示字符串(约定最后一个字符是'\0');

      char a[10]="Welcome";
      char *s="Welcome";
      s="hello";对
      a="hello";错

    • 下方有课后作业实现了字符型指针数组实现程序主菜单!!!!

  • 指针函数

    • 定义:若一个函数返回的是指针,则称该函数为指针函数

    • 函数内部的变量都是局部变量,当函数执行完后,会自动释放,在主调函数中不能再访问,访问一段释放的内存,是非法操作,若修改非法内存中的值,可能会出现严重后果,不可预料。

    • 第二条的解决方法如下:
      1. 用static将局部变量变为静态局部变量
      2. 字符串常量类似于静态变量,在程序结束时,才释放内存。函数中使用 char *str="Welcome"; "Welcome"是一个常量,在内存中有确定的地址,把这个地址返回给主调函数是可以的
      3. 在堆空间分配内存,返回分配内存的地址给主调函数。str=(char *)malloc(20);
         注意:堆空间的使用一定要注意使用后要释放。 malloc / free 一定是对应的,如果不释放,指针已经指向其他地方,     此空间成为内存泄漏空间。

  • 函数指针

    • 函数指针是一个专门用于保存函数首地址的指针,实际上就是函数的入口地址。

    • 实例:int (*p)(int,int);

  • const与指针

    • const int *p;与int const *p;的区别与理解;

    • 区别与理解:把数据类型去掉const int *p->const *p 说明*p是常量,即p指针指向的内存空间的整形值不允许更改
                            把数据类型去掉int * const p-> * const p 说明指针p是常量,即p指针不能改变;

  • void指针

    • void* 
      void指针不是空指针,而是一种不确定数据类型的指针,可以通过强制类型转换将void型指针转换为任何类型的指针。

    • 举例:
      void *malloc(size_t size);

      char a[20]
      a=(char *)malloc(sizeof(a));

      int b[20]
      b=(int *)malloc(sizeof(b));

课后练习部分:

1.统计随机数的分布,产生10000个以上的10以内随机数,统计0~9出现的次数,保存在数组里。
2.编写字符串逆序函数,不借助于任何字符串函数,使用指针完成。
3.编写返回的指针的函数,不借助于任何字符串函数实现字符串的拷贝,返回目的字符串指针。
4.编写返回的指针的函数,不借助于任何字符串函数实现字符串的连接,返回目的字符串指针。
5.用字符指针数组实现主程序的menu()菜单。

第一题:

第二题:

第三题:

第四题:

第五题:

Everything is OK`  QAQ

****************************************************************************************************************************************

按照这节奏是要一星期上完一年的C语言课程呀!(哈哈哈~~~)

忙碌的时光总是过得很快;快乐的时光也总会过的很快;

马上就要复习链表部分了,内心还是有点小激动的~~~~

加油!相信自己~ YOHO~

猜你喜欢

转载自blog.csdn.net/qq_42292831/article/details/81123023