程序猿大神教你学C语言/C++编程—数组的原理:写一个小程序

C语言是面向过程的,而C++是面向对象的

C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

很多小伙伴都老是会碰到疑问,其实还是基础没打扎实,这些题如果你不看答案你能知道多少呢?如果还有很多不知道就证明基础没打扎实,如果你还在入门纠结,如果你还在苦恼怎么入门!小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

C语言是很实用的语言,但是它的语法也是比较怪异的,至少在我学了很多种编程语言后我才体会到这点,C语言的作者Dennis Ritchie后来开发了一种叫Limbo的语言,Limbo中各种标记的使用和C非常类似,但是声明语法完全设计成Pascal风格。由此可见,作者自己其实也在反省C语言的声明语法,所以不要误以为C是一门完美的语言,C追求的是便捷实用效率高,只要语法书写方便、编译器实现比较容易、执行效率高,在C语言看来就是好的。就拿数组来讲,可能很多新手都不解为什么数组的下标是从0开始而不是像Fortran一样从1开始,我举个例子,我之前上班的公司位于深圳一座5层的写字楼里,假设某人每爬一楼要花费10秒,那么此人从楼下爬到5楼,一共要多少秒?50秒?恭喜你,回答错误!答案是40秒;再比如你们老师问你19XX年是什么世纪?你总不能回答是19世纪吧,那还是20世纪啊,2000年也是属于21世纪啊。这些都是为什么呢?假如我们把写字楼和地面等高的那层计数为0层,最初的世纪技术为0世纪,最初的公历年计数为0年,那是不是都很好理解了?如果你还不理解,我们来举个二维数组(二维数组后面会将)的例子,假设我们定义了一个二维数组int array[M][N],我们要引用第line行第col列的元素我们可以使用array[line*width+col],那假设C语言里数组是从1开始,我们要引用这个元素我们就要写成array[(line-1)*width+col],这不麻烦吗,每次都要加括号多写个减1。所以如果再又新手问你为什么数组从0开始,因为语法书写简单,编译器实现起来方便。

学习了数组的原理,我们来写一个小程序,来复习下自己学过的知识,一个截图放不下我就直接贴代码了,再次告诫大家不要直接复制粘贴,要自己动手敲出来,只有这样你才能知道什么地方容易犯错,你犯的错越多,编程水平提高的越快,我前面只贴截图就是担心有些人偷懒不敲代码。

/* 使用选择法排序 */

# include

void main()

{

int i, j, min, temp;

// 定义一个整型得一维数组

int array[10];

// 输入数据

printf("Please input ten integer: ");

for(i=0; i<10; i++)

{

printf("array[%d] = ", i);

scanf("%d", &array[i]);

}

printf("The array is: ");

for(i=0; i<10; i++)

printf("%d ", array[i]);

printf(" ");

// 排序

for(i=0; i<9; i++)

{

min = i;

for(j=i; j<10; j++)

if(array[min]>array[j]) min = j;

temp = array[i];

array[i] = array[min];

array[min] = temp;

}

// 输出

printf(" The result: ");

for(i=0; i<10; i++)

printf("%d ", array[i]);

printf(" ");

}

这段代码已经写了注释,输入数据和输出应该没什么问题,最主要的就是排序那段,

// 排序

for(i=0; i<9; i++)

{

min = i;

for(j=i; j<10; j++)

if(array[min]>array[j]) min = j;

temp = array[i];

array[i] = array[min];

array[min] = temp;

}

简单选择排序的基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。我们在代码里使用的是嵌套for循环来做的,而且要注意C语言数组是从0开始,所以我们是先选取array[0],然后依次和它身后的元素比较,如果array[0]较大,就发生交互,这样外层for循环一趟走下来,array[0]自然就会变成了最小的数;第二趟就是从array[1]开始了,这样又会在剩下的数里选出最小数,大家自己去测试结果吧。

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

我们前面都讲的数组大小和初始化是相同的情况,现在我们两个两种例外的情况,当定义的数组大小和后面的初始化列表不同时,看看会发生什么情况:

#include

void main()

{

int a[5] = {1,2,3,4,5,6,7,8};

int b[5] = {1,2,3};

int i;

printf("sizeof(a)=%d sizeof(b)=%d ",sizeof(a),sizeof(b));

for(i = 0;i < 10;i++)

{

printf("a[%d]=%-8d b[%d]=%d ",i,a[i],i,b[i]);

}

}

输出结果为:

sizeof(a)=20 sizeof(b)=20

a[0]=1 b[0]=1

a[1]=2 b[1]=2

a[2]=3 b[2]=3

a[3]=4 b[3]=0

a[4]=5 b[4]=0

a[5]=4199376 b[5]=2293504

a[6]=2293576 b[6]=2293560

a[7]=4199478 b[7]=2293700

a[8]=4199376 b[8]=1

a[9]=0 b[9]=2

可以看到我们定义的两个数组a、b都是有5个元素的数组,其中a的初始化列表长度超出了5,而b的初始化列表长度只有3,观察我们的输出结果,我们可以发现a[4]后面的元素就是无用的数据了,说明初始化列表{1,2,3,4,5,6,7,8}里只有前面的5个元素被赋值给a了,然后超出的部分被截断了;而对于b,我们可以发现{1,2,3}赋值给了b的前三个元素,至于b[3]和b[4]都是使用0来填充的,这就是数组在这两种情况下的默认处理。注意for循环里我们使用了%-8d这么一句,-表示让输出左对齐,8表示输出的数占8个字节大小

前面我们学习了最简单的int数组,现在我们来看多维数组(这里只讲用的最多的二维数组),前面我们讲多重指针的时候说了,一个二级指针变量,它的值本身也是一个指针变量,我们可以对照起来理解,比如int a[2][3],这就是一个二维数组,它是第一维为2、第二维为3的数组,其实它就是一个数组的数组,它有两个元素,每个元素都是一个包含有3个int元素的数组,我们来用看看实际的例子,下面三种形式表示的二维数组其实是一样的:

注意多维数组在定义的时候,只有第一维的维数可以省略,比如上面的int b[][3]={{1,2,3},{4,5,6}},只要根据它后面的初始化列表编译器能够确定它的第一维数就行了。然后我把数组a在内存里的状态用图画出来让大家理解,二维数组a其实就是包含有两个元素a[0]和a[1]的数组,同时a[0]和a[1]本身也是包含有三个元素数组

前面我们讲了数组其实就是一个特殊的指针,它和普通指针还是还差别的,那么当数组和指针组合在一起会发生什么呢,我们来看下面一个小程序,虽然小,但是要认真理解:

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

我们怎么理解(*p1)[2]和*p2[2]呢,我们要对比前面讲指针时遇到const的情况,int const *p是常量指针,int * const p是指针常量,我们当时用到的是就近原则,这里同样也要用就近原则。对于(*p1)[2],显然*里p1比较近,所以我们首先确定了p1是一个指针变量,然后我们看到后面的[2],说明它是一个指向带两个元素的数组的指针变量;对于*p2[2],[]的优先级是高于*的,所以[2]离p2比较近,我们先确定了p2是一个数组,再看它前面的*,我们就知道了p2是一个有两个指针变量的元素的数组。我们在后面使用sizeof时,可以明显看出p1是一个指针,它的长度只有4,而p2是一个有两个元素的数组,它的长度为8.

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

今天就到这里,欲知后事如何且听下回分解(手动滑稽)~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容