新手学习C语言心得

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. 思维导图

http://t.csdn.cn/5LQOY

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值