1.学习C语言心得
经过几天的学习我已经稍微了解C语言,也渐渐明白上机操作的重要性,在学习的过程中,我也逐渐找到自己的学习方法,多敲代码,多熟悉代码,不会的题也可以去借鉴别人的代码,看懂别人的代码也是学习的一部分,要懂得融会贯通,知道如何解题,知道解题思路才是重要的。
2.学习时遇到的困难
2.1指针
刚开始接触指针时,我自己就觉得脑子空白,就单指针,有时候都觉得很抽象,况且指针还会和字符,数组等等结合,如果指针没有搞懂,那么后续学习就会很吃力,下面附上图,这是我理解指针的方式。
光知道概念也是不可以的,还是要多刷些题,每次遇到这些题我都要感叹出题人的心机,真是辛苦你们了。
2.2 各种东西与指针的关系
感觉只要和指针扯上关系,我就觉得抽象,可能也是我理解有问题。
2.2.1 字符指针
因为老师喜欢举例子,并且我学起来也觉得很有效,所以这里举个例子。
定义一个指向char的指针并且取出来它的字符。这个图上面是指向int的指针并取出它的值,这里要知道pc指的是ch的首地址。
2.2.2 数组与指针的关系
这个是我目前觉得第一难得东西,因为中间扯到的知识点很多。
2.2.2.1一维数组与指针的关系
同理,我感觉举个例子效果比较好一点。先用宏替换一个数这样后续方便更改,定义一个长度为5的float数组,之后定义一个指向float的指针。万变不离其宗,指针指向的是这个长度为5的float数组的首地址。
#include <stdio.h>
#define SIZE 5
int main(void)
{
//定义一个长度为SIZE的float数组
float scores[SIZE]={78,89,96,93,71};
//定义一个指向float的指针
float * pf=NULL;
//将数组中第一个元素的首地址赋值给pf
pf=scores;// pf=&scores[0]
int i=0;
//输入
printf("请输入%d个元素\n",SIZE);
for(i=0;i<SIZE;i++)
{
//scanf("%f",&scores[i]);
scanf("%f",scores+i);
//scanf("%f",&pf[i]);
//scanf("%f",pf+i);
}
//输出
for(i=0;i<SIZE;i++)
{
//printf("%.1f ",scores[i]);
printf("%.1f ",pf[i]);
//printf("%.1f ",*(scores+i));
//printf("%.1f ",*(pf+i));
}
printf("\n");
return 0;
后面更难的,我觉得是用子函数去将数组的值输出,这个是抽象遇到抽象,抽象坏了。首先用宏
替换一个数,方便后续更改然后定义一个菜单函数,这样知道输入的值对应哪些操作,然后定义子函数一共有五个,1是给数组中输入数值,2是将数组中的值输出,3是求出数组中的最大值并且得到它的地址,4是求出最小值,并得到最小值的地址,-1是退出,其核心就是用for循环。最难的部分是定义子函数时的关系,返回值,参数这些,将这些搞懂,也就没其他的大难点了。
2.2.2.2二维数组与指针的关系
与一维数组相比,二维数组要考虑的更多,因为它不止一个元素。
一样的,举例子,定义一个长度为3的数组,该数组中的每个元素又是一个长度为4的float数组。和一维数组一样,定义指向这个float数组的指针,后续就比较简单用for循环将数组中的值输出。
//定义一个长度为3的数组,该数组中的每个元素又是一个长度为4的float数组
float arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//定义一个指向float的指针
float * pf=NULL;
//&arr[0][0] ----> arr[0][0] (float) &arr[0][0] (float *)
pf=&arr[0][0];
int i=0;
for(i=0;i<3*4;i++)
{
if(i%4==0)
{
printf("\n");
}
printf("%.1f ",pf[i]);
}
printf("\n");
return 0;
和一维数组一样的,最难的点,个人感觉就是编写子函数然后进行的操作。
1.编写一子函数,将arr数组中的元素输出
2.编写一子函数,將strArr数组中的元素输出
这个和上述一维数组还是有差别的 一维数组:float *scores,int n 二维数组:float scores[][数值],int n 差别在于第一个参数,这是因为,它们中间有个相互转换的关系
*scores=scores[] 二维数组也可以写成 (*scores)[]也是一样的。
2.2.2.3指针数组
指针数组与数组指针是两种东西,比如一个有10个指针的数组,该指针是指向一个整型数的 int * a[10]与一个指针,该指针指向一个有10个整型数的数组int(*a)[10]
一个是数组指针,一个是指针数组
例题:.定义一个长度为4的数组,该数组中每个元素是一个指向float的指针,该数组中每个元素都是指针,所以都是&,每个都代表了对应的首地址。
float (*parr)[4]; //指针sizeof(parr)=8 是一个指向数组的指针 parr+1 sizeof(float [4])
数组定义的语法:
每个元素的数据类型 数组名[元素的个数] //元素的个数必须为常量
float * arrp[4];//----> float * [4]
//izeof(arrp)=sizeof(float *)*4
#include <stdio.h>
int main(void)
{
float a=2.5,b=34.5,c=7.5,d=6.5;
//定义一个长度为4的数组,该数组的每个元素是一个指向float的指针
float * arrp[4]={&a,&b,&c,&d};
int i=0;
for(i=0;i<4;i++)
{
printf("%.1f ",*arrp[i]);
}
printf("\n");
同样的难点也是使用库函数 1.使用库函数对strArr按照字符串的大小(strcmp)/字符串的长度(strlen)排序,2.使用库函数对pstr按照字符串的大小/字符串的长度排序
使用for循环将数组中的列和行逐步进行比较,然后使用if语句进行比较最后输出。
上面三点是我个人认为最难的三个点,后面的难点感觉和它们三个比还是略逊一筹。
2.3 三大结构
三大结构包括顺序,选择,循环,个人认为难点在于选择与循环。
2.3.1 选择
单分支选择结构
if(条件为真)
{
语句1;
}
双分支选择结构
if(条件为真)
{
语句1;
}else
{
语句2;
}
switch,case
//输入年份和月份判断有多少天
#include <stdio.h>
int main(void)
{
int year=0,month=0,day=0;
printf("请输入一个年份\n");
scanf("%d",&year);
printf("请输入一个月份\n");
scanf("%d",&month);
switch(month)
{
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10:
case 12:
printf("day=31天\n");
break;
case 4 :
case 6 :
case 9 :
case 11:
printf("day=30天\n");
break;
case 2 :
if(year%4==0&&year%100!=0||year%400==0)
{
printf("day=29天\n");
}else
{
printf("day=28天\n");
}
}
return 0;
}
2.3.2 循环
while() for ()
//1+1/2+1/3+1+/4............+1/1000
#include <stdio.h>
int main(void)
{
float i=0,sum = 0;
for(i=1;i<=1000;i++)
{
sum=sum+1/i;
}
printf("sum =%f\n",sum);
return 0;
}
do.....while()
关键字
break(跳出循环)
continue 结束本次循环,继续执行下一次循环
死循环
3. 思维导图