摘要:今天起,开始学习linux系统编程中的另一个新的知识点----进程,在学习进程之前,有很多关于进程的概念需要了解,但是,概念是很枯燥的,也是让人很容易迷糊的,所以,先抛开这些抽象的概念,以实际编码来熟悉进程到底是个什么东东,这样学习起来要有兴趣一些,在学习一门技术时,找一种能提高自己兴趣的方法是很重...
阅读全文
摘要:上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这里,我们将上节当中用dup或dup2实现复制文件描述符改用fcntl,程序如下: 先将tes...
阅读全文
摘要:今天继续学习文件与io,主要是学习文件共享及文件、复制文件描述符,有点抽象,主要是概念上的理解,但是很重要,下面一一来分解: 文件共享: 回顾一下,在linux系统调用中,是通过文件描述符来访问文件的,文件描述符是一个非负的整数,这是站在用户的观点来看的,实际上在linux内核上是有一定的数据结构来...
阅读全文
摘要:上次我们利用文件的read和write来实现了简易的cp命令,其中将源文件拷贝到目标文件时,我们给目标文件的权限是写死的,而非根据源文件的权限生成的,如下: 今天就来解决这个问题,来学习获取文件权限相关的函数,言归正传,正入正题。 stat:功能:读取文件元数据 关于stat结构体的结构如下...
阅读全文
摘要:今天继续学习文件与io,话不多说,开始进入正题: 文件的read和write系统调用: 说明:函数中出现在size_t和ssize_t是针对系统定制的数据类型: 下面以一个实现文件简单拷贝的示例(类似于cp命令,但是没cp命令强大),来对其文件的读写有个感性的认识: #include...
阅读全文
摘要:经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自己亲自验证过的,我机智不算聪明,所以也没必要去校仿那些“大脑非常聪明”的理解能力很强的“高人”,也许...
阅读全文
摘要:今天接着对链表进行进一步完善,对于上节中已经实现了对节点的删除操作,这次对这个操作进行升级,符合条件的都可以被删除(通过函数指针来实现),具体实现如下:list.c:#ifndef _LIST_H_#define _LIST_H_#include typedef struct node{ int data; struct node* next;} node_t;typedef void (*FUNC)(node_t*);typedef int (*FUNC2)(node_t*);//这个是用来判断是否节点符合条件的node_t* list_insert_front(node_t* ...
阅读全文
摘要:今天继续完善自己的链表,上次已经实现了链表的插入、遍历、销毁方法,对于链表的插入,我们上次是在头结点进行插入的,这次,我们来实现一个在任意结点进行插入的方法。实现链表的另外一种插入方法----在任意位置进行插入:在实现它之前,先实现获取任意位置的结点的函数,为便在实现任意插入时会使用到它,先在头文件中定义:list.h:#ifndef _LIST_H_#define _LIST_H_#include typedef struct node{ int data; struct node* next;} node_t;typedef void (*FUNC)(node_t*);node...
阅读全文
摘要:在于C语言指针的相关知识点算是已经学得差不多了,当然,语言的学习是一个终生的,所以还需慢慢去学习,今天就以一个非常经典,也是体现指针应用的一个例子,来操作练一下所学的指针相关的知识点-----链表对于链表,我想学过编程的应该都对它有比较清楚的了解,下面简单对它进行回顾一下:链表的基本操作:下面自己动手利用指针的知识一点一点来实现链表,同时学习一下C语言多文件的编译风格:第一步:搭建好基础开发框架:首先需要定义一个结构体,来代表一个结点,结点里面的数据域和指针域两个构成,将其定义放到头文件(.h)中【至于放到.h头中的好处,请参考http://www.cnblogs.com/webor2006/
阅读全文
摘要:今天继续对指针进行探讨,请看下面:函数指针:下面通过一个程序,简单明了的对函数指针有个基本认识:#include void test(int n){ printf("test %d ...\n", n);}int main(void){ void (*f)(int); // 这里的f就是函数指针变量 void (*f2)(int); // 这里的f就是函数指针变量 // 以下两种写法是等价的 f = &test; f2 = test; // 以下两种写法也是等价的 f(100); // 调用函数 (*f2)(200); ...
阅读全文
摘要:今天继续对于C语言的指针进行学习,话不多说,进入正题。数组作为参数传递【指针传递】:下面通过一系列程序来说明数组作为参数传递是属于指针传弟:一维数组:编译运行,看结果:编译运行:我们知道“数组定义之后,它的首地址是无法重新指向新地址的”,如下:编译:而请看如下情况:编译运行:说明:当一维数组作为函数参数时,有三种写法都等价,都是int*a二维数组:编译:如果省略了二维数会怎样呢?编译:说明:命令行参数:main函数是程序的入口函数,今天来对其参数进行研究,先通过程序来直观的感受下:运行结果:分析一下内存模型:所以,可以通过循环,将命令行的所有参数都打印出来:对于上面的程序,也能用指针的指针来代
阅读全文
摘要:今天继续对指针进行研究,话不多说,进入正题:指针数组与数组指针:关于这两者的介绍,在http://www.cnblogs.com/webor2006/p/3463918.html有介绍,下面简单回忆下:以下通过一些示例来进一步理解指针数组和数组指针:示例一:输出结果:示例二:运行结果:示例三:输出结果:指针数组与二维数组:基于上面的实现,再来通过一个图来总结下指针数组与二维数组:指针的指针:下面通过一程序来直观的感受下:运行:下面通过一个实例来说明下指针的指针的使用场景:运行结果:上图中可以看到find函数使用了指针的指针,那为什么要用它呢,我用一级指针是否能达到同样的目的呢,来看下面的尝试:
阅读全文
摘要:今天继续对指针进行学习,正式正入主题:字符指针:对于上面的理论,下面用程序进行论证:输出结果:所以论证了:str1是字符数组变量,str1保存了字符串"cppcourse"str2是字符指针变量,str2并不保存字符串“cppcourse”本身,而是保存常量"cppcourse"的地址编译失败:所说又论证了“由于str2指向的是字符串常量“cppcourse” ,常量不能被更改,因而str2[0] = 'C';将引发错误。”字符数组与字符指针的区别:下面分别从以下几个方面来解析:存储分配读写权限这个上面已经论证过了:字符数组是可读可写的字
阅读全文
摘要:上次对指针进行了初步认识,接下来,继续挖掘C语言的魂!指针与一维数组:这时编译是没有问题的:编译:输出结果:这里面会有点绕,但很重要,先运行一段程序,再来阐述上面的观点:#include int main(void){ int a[] = {1, 2, 3, 4, 5}; int* p = a; printf("%p\n", a); printf("%p\n", &a); printf("%p\n", a+1); printf("%p\n", &a+1); return 0;}运行结果:结果 a+1
阅读全文
摘要:经过前面漫长的c语言学习,终于进入了C语言中最核心,最重要的部分啦!其实对于前面的知识,自己都有所了解,必境C语言也是一直在学(只是没学通而已(∩_∩)),但是通过写博文的方式,我发现最好的一个地方就是它能够让你很踏实地去学习,摒弃浮燥,因为你写出来的东西都是自己亲自验证过的,强制让自己把所学的东西...
阅读全文
摘要:继续进行C语言学习之旅,现在已经快进入了C的核心了,所以需更加细心地学习,言归正传,开始学习:什么是结构体呢?定义结构体类型:注意:结构体最后的分号不能省略这时编译就出错了:结构体变量:当我们定义好了一个结构体类型之后,就可以使用它,类似于基本类型一样,但是:会有一些差别。①使用方式一【用得较少】:注意:struct关键字不能省略,代表该变量是一种结构体类型:这时编译就出错了:②使用方式二【用得较少】:我们可以将结构体声明在函数体内,声明之时就给出变量:③使用方式三【通常用这种方式】:从使用方式一中可以看出,使用起来不是那么方便,有没有解决办法呢?答案当然有,也就是第三种方式,用typedef
阅读全文
摘要:今天继续学习c语言语法,相对之前的知识而言,这次的知识就比较重要了,算是C语言的核心基础了,所以得好好学它,下面正式开始:存储类别: 它指定了变量生存期(时间)与作用域(空间)对于下面这个函数:运行结果:解析:静态变量,只分配一次内存,离开作用域的时候,生存期并未结束,它的生存期是整个程序的执行期[这也说明作用域和生存期是不一样的],所以上面执行了两次的结果累加了。另外,需要注意:关于这个可以参考博文:http://www.cnblogs.com/webor2006/p/3427567.html,里面有详细的说明。下面有两个C文件:test.c的内容:1_9.c的内容:这时编译两个c到一个可执
阅读全文
摘要:继上次学完函数之后,这次来通过一个实例来加深印象,下面会对其实现过程进行一一剖新,先看一下什么叫“八皇后问题”具体的算法可以分解为:像上图中第五行就已经出现了死胡同,这时应该退到第四行,重新安放皇后:了解了算法流程,下面一步一步来实现:第一步:#include #define QUEEN_NUM 8int queen[QUEEN_NUM];// 在第y行上放置皇后void place(int y);int main(void){ place(0);//首先从第1行开始放置 return 0;}void place(int y){ }说明一下queen[QUEEN_NUM]数组...
阅读全文
摘要:我们知道C语言是面向过程的编程语言,函数是C语言中模块化编程的最小单位,学编程的都会知道,所以,没有什么难点,但是对于C的函数,里面还是有一些需我们注意的地方,下面正式开始学习。先来看一个例子,由于它太熟悉了,所以就不从头开始学习了:运行结果:对于这个简单的程序,其中蓝色说明部分是我们需要注意的,对于函数,是需要提前声明的,有以下几点:①如果将声明给去掉,则会给出警告:②如果函数写在调用方之前,则可以省去声明,如下:编译也是能通过的:③ 函数的声明的形参可以省略形参名,只要形参数据类型既可:编译也是能通过的:下面以一个小例子来做为练习---------猜数游戏下面先贴出简单的流程图:具体实现:
阅读全文
摘要:字符串与字符数组#include #include //包含strlen函数int main(void){ printf("size of \"cppcourse\" = %d\n", sizeof("cppcourse")); printf("length of \"cppcourse\" = %d\n", strlen("cppcourse")); return 0;}字符串变量初始化二维数组二维数组初始化对于一维数组,如果下标越界了,得到的值是不确定的,那对于二维数组呢
阅读全文