这篇博文是整理的上课的笔记,所有的图片皆来自于:
东北林业大学王育英老师,邮箱: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语言指针笔记》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
出处:https://grimoire.cn/note/c-pointer-note.html
版权:本文《C语言指针笔记》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任