MENU

C语言指针笔记

April 18, 2020 • 笔记

这篇博文是整理的上课的笔记,所有的图片皆来自于:
东北林业大学王育英老师,邮箱:wyy@nefu.edu.cn
博文的所有代码均为课堂整理的笔记,我对代码进行了修改,以增加可阅读性

一、指针

1.指针必须先赋值,再使用

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 20:29:48
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i=10;
    int *p;
    p=&i;
    //使用指针之前一定要记得先赋值
    //注意野指针
    *p=12;
    printf("%d",i);
    return 0;
}

2.数组赋值的方式

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 20:29:48
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    double a[20],*pa=a;
    for (int i=0;i<6;i++)
    {
        //五种等价的赋值方式
        scanf("%lf",&a[i]);
        scanf("%lf",&pa[i]);
        scanf("%lf",a+i);
        scanf("%lf",pa+i);
    }
    for (pa=a;pa<a+6;pa++)
    {
        scanf("%lf",pa);
    }
    return 0;
}

3.动态申请空间

由于C语言没有垃圾回收机制,所以使用malloc申请出来的空间是不会自动被系统回收的,即使是在函数里面申请的空间,函数运行结束以后被申请的空间也不会自动被释放,因此,请记得使用free函数将申请的内存释放掉

虎头蛇尾是俗人的习惯,有始有终是君子的操守

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 20:46:42
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i;
    double *p1,*p2;
    scanf("%d",&n);
    p1=p2=(double *)malloc(n*sizeof(double));
    //申请了大小为n的空间
    //malloc 包含于 stdlib.h 头文件中
    for (int i=0;i<n;i++)
    {
        scanf("%lf",p1+i);
    }
    for (int i=0;i<n;i++)
    {
        printf("%.2lf\n",*(p2+i));
    }
    free(p1);
    //申请了空间一定要记得释放
    return 0;
}

4.数组元素的引用方式

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 20:53:04
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5],*pa=a;
    for (int i=0;i<5;i++) a[i]=i+1;
    for (int i=0;i<5;i++)
    {
        //四种等价的引用方式
        printf("%d\n",*(pa+i));
        printf("%d\n",*(a+i));
        printf("%d\n",pa[i]);
        printf("%d\n",a[i]);
    }
    return 0;
}

5.数组倒序

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 21:08:06
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>

void swap(int *lst,int length)
{
    //日常双指针操作
    int *left,*right;
    left=lst;
    right=lst+length-1;
    while(left<right)
    {
        int tmp=*left;
        *left=*right;
        *right=tmp;
        left++;
        right--;
    }
}

int main()
{
    int lst[20]={1,2,3,4,5,6,7,8,9};
    int length=9;
    swap(lst,length);
    for (int i=0;i<length;i++)
    {
        printf("%d ",lst[i]);
    }
    return 0;
}

6.指针与字符串

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 21:12:41
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 * 》》字符串的输出《《
 */
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[40]="cxk tuodi dabai shaqun";
    printf("%s\n",str);
    printf("%s\n",str+4);
    return 0;
}
/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 21:16:26
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 * 》》字符串的复制《《
 */
#include <stdio.h>
#include <stdlib.h>

void copy(char *str1,char *str2)
{
    while (*str1!='\0')
    {
        *str2=*str1;
        str1++;
        str2++;
    }
    *str2='\0';
}
int main()
{
    char str1[40]="cxk tuodi dabai shaqun";
    char str2[40];
    copy(str1,str2);
    printf("%s",str2);
    return 0;
}

二、指针与二维数组

1.二维数组的指针变量

二维数组的内存是连续的,所以可以有以下的程序

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 21:32:11
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *p,index=0;
    int a[3][4]={1,3,5,6,7,9,11,13,15,17,19,21};
    for (p=a[0];p<a[0]+12;p++)
    {
        printf("%4d ",*p);
        if (++index%4==0) printf("\n");
    }
    return 0;
}

然后这里是不建议这样初始化二维数组的,这种写法就像是甲方没给够钱的外包软件公司的杰作

2.行指针变量

(*p)[4] => (*指针名)[一维数组维数]

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 21:57:16
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int (*p)[4],i;
    int a[3][4]={1,3,5,6,7,9,11,13,15,17,19,21};
    for (i=0,p=a;i<3;i++,p++)
    {
        for (int j=0;j<4;j++)
        {
            printf("%4d",*(*p+j));
        }
        printf("\n");
    }
    return 0;
}

2.用二维指针处理字符串

感觉这段代码就很迷,不知道有什么用……

/*
* @Author: Mr.Sen
* @LastEditTime: 2020-04-18 22:44:11
* @Website: https://449293786.site
* @原创代码,版权所有,转载请注明原作者
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void read(char **str1,int length)
{
   char str[100];
   for (int i=0;i<length;i++)
   {
       gets(str);
       int len=strlen(str);
       str1[i]=(char *)malloc(len+1);
       strcpy(str1[i],str);
   }
}
int main()
{
   char **p,*name[5];
   read(name,5);
   p=name+1;
   printf("%s\n",*p);
   return 0;
}

3.指针与函数

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 22:51:37
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int find_max(int x,int y)
{
    return x>y?x:y;
}
int main()
{
    int find_max(int,int),(*p)(int,int)=find_max;
    int number1,number2,max_number;
    scanf("%d%d",&number1,&number2,&max_number);
    max_number=(*p)(number1,number2);
    // max_number=find_max(number1,number2);
    printf("max=%d",max_number);
    return 0;
}

4.用函数指针变量做函数参数

这玩意儿有cmp函数那味儿了

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 23:01:31
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int find_max(int x,int y)
{
    return x>y?x:y;
}

int find_min(int x,int y)
{
    return x>y?y:x;
}

int plus(int x,int y)
{
    return x+y;
}

int poss(int x,int y,int (*fun)(int,int))
{
    return (*fun)(x,y);
}

int main()
{
    int find_max(int,int),(*p)(int,int)=find_max;
    int number1,number2,number3;
    scanf("%d%d",&number1,&number2,&number3);
    printf("%d\n",poss(number1,number2,find_max));
    //max_number;
    printf("%d\n",poss(number1,number2,find_min));
    //min_number;
    printf("%d\n",poss(number1,number2,plus));
    //plus_number;
    return 0;
}

5.返回指针的函数

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-04-18 23:07:05
 * @Website: https://449293786.site
 * @原创代码,版权所有,转载请注明原作者
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int *fun(int *a,int *b)
{
    return *a>*b?a:b;
}
int main()
{
    int a=2,b=3;
    int *p;
    p=fun(&a,&b);
    printf("%d",*p);
    return 0;
}


以上。

作者:NorthCity1984
出处:https://grimoire.cn/note/c-pointer-note.html
版权:本文《C语言指针笔记》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

Last Modified: April 22, 2020