`
8366
  • 浏览: 810222 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

全面复习linux C语言系列--第一讲--基础知识

阅读更多

 

 

看别人code的时候,发现很多基础的知识都不牢固,东找西找,总算明白,可是总是觉得自己的知识没有成体系,需要总结有一下,方便以后的工作和学习!

 

 全面复习linux C语言系列 我希望能坚持写完,估计会有20讲,每天都写一点吧!希望自己能坚持下去!

 

 

 

变量的存储类型:

 

1.auto

 

在函数中申明的变量,如果不进行特殊的说明都是自动变量,在系统调用这些变量所在的函数时候,系统将从堆栈中自动分配存储空间,在函数返回后,将由系统自动释放这些空间。默认存贮类型就是auto的

 

 

2. static

 

static 声明的变量在2次调用间保持原值,也就是说static声明的变量,在两次调用间,其存储空间不会被系统自动释放,static 变量在编译的时候赋初值,在运行过程中,除非使用复制语句,否则不会对变量赋值!

 

 例子:

 

#include <stdio.h>
main()
{
    int i;
    for(i=0;i<3;i++)
        printf("%d\n",func(1));
}
int func(int x)
{
    static int n=5;
    n += 1;
    return x+n;
}
 

上面这个程序的运行结果是

 

7

8

9

 

如果去掉 static 则 结果是

 

7

7

7

 

3. extern

 

extern变量也成为外部变量,是在函数外部定义的变量。通畅可在头文件中定义外部变量,在源代码中用extern 声明后引用!

 

4.register

 

也成为寄存器变量,为了提高程序的运行效率,将使用频率高的变量直接存储到寄存器中,而不是保存到内存中!

 

 

sizeof 和 strlen的区别:

 

sizeof 求字符串变量的长度时候,是指整个字符串数组的长度,而用strlen求得的字符串长度不包括最后的字符串结束符

 

 

 

数组,结构,指针:

 

 

 

C语言的参数传递有传值和传地址两种方式  (c ++多了 一中 引用传递)

 

c语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也要最循这一规则。调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

 

1. 值传递  Exchg1

 

 

2. 地址传递 Exchg2

 

例子

 

[root@xhu-vm test]# more test1.c 
#include <stdio.h>
void Exchg1(int x, int y) 
{
  int tmp;
  tmp=x;
  x=y;
  y=tmp;
  printf("Exchg1:x=%d,y=%d\n",x,y);
}


void Exchg2(int *x, int *y) 
{
  int tmp;
  tmp=*x;
  *x=*y;
  *y=tmp;
  printf("Exchg3:x=%d,y=%d\n",*x,*y);
}


int main()
{
  int a=4,b=6;
  Exchg1 (a,b) ;
  printf("a=%d,b=%d\n",a,b);
  Exchg2 (&a,&b);
  printf("a=%d,b=%d\n",a,b);
}

  运行结果

 

[root@xhu-vm test]# gcc test1.c -O -o test1
[root@xhu-vm test]# ./test1
Exchg1:x=6,y=4
a=4,b=6
Exchg3:x=6,y=4
a=6,b=4
[root@xhu-vm test]# 
 

 

指向另一指针的指针

 

设计一个函数:void find1(char array[], char search, char *pa)
要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。

 

[root@xhu-vm test]# more test2.c 
#include <stdio.h>
void find2(char array[], char search, char **ppa)
{
        int i;
        for (i=0; *(array + i) != 0; i++)
        {
                if(*(array + i) == search)
                {
                        *ppa = array + i;
                        break;
                }
                else if(*(array + i) == 0)
                {
                        *ppa = 0;
                        break;
                }
        }
}

int main()
{
        char str[] = {"afsdfsdfdf\0"}; /* 待查找的字符串 */
        char a = 'd';/* 设置要查找的字符 */
        char *p = 0; /* 如果查找到后指针p将指向字符串中查找到的第1个字符的地址。 */
        find2(str, a, &p); /* 调用函数以实现所要操作。 */
        if (0 == p)
        {
                printf("没找到!\n"); /* 如果没找到则输出此句 */
        }
        else
        {
                printf("找到了,p = %d\n", p); /* 如果找到则输出此句 */

        }
        return(0);
}
 

结果:

[root@xhu-vm test]# gcc test2.c -O -o test2
[root@xhu-vm test]# ./test2
找到了,p = -1075071597
[root@xhu-vm test]# 
 

分析:

ppa指向指针p的地址
对*ppa的修改就是对p值的修改

 

函数指针:

就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函数了。

 

 

 a.通过函数指针变量调用函数

 

[root@xhu-vm test]# more test3.c 
#include <stdio.h>
void MyFun(int x);
void (*FunP)(int);
int main()
{
        //case1
        MyFun(10);

        //case2
        FunP=MyFun;
        (FunP)(20);

        //case3
        FunP=&MyFun;
        (*FunP)(30);


}
void MyFun(int x)
{
        printf("%d\n",x);
}


[root@xhu-vm test]#

 

运行结果:

 

[root@xhu-vm test]# ./test3
10
20
30
 

2中方式: 1.将调用函数的地址付给函数指针变量

                2. 直接将函数名字赋给 函数指针变量

 

b. 函数指针作为某个函数的参数

 

[root@xhu-vm test]# more test4.c
#include <stdio.h>
void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
typedef void (*FunType)(int); /* ②. 定义一个函数指针类型FunType,与①函数类型一致 */
void CallMyFun(FunType fp,int x);

int main(int argc, char* argv[])
{
CallMyFun(MyFun1,10); /* ⑤. 通过CallMyFun函数分别调用三个不同的函数 */
CallMyFun(MyFun2,20);
CallMyFun(MyFun3,30);
}
void CallMyFun(FunType fp,int x) /* ③. 参数fp的类型是FunType。*/
{
        fp(x);/* ④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的。 */
}
void MyFun1(int x) /* ①. 这是个有一个参数的函数,以下两个函数也相同。 */
{
        printf("函数MyFun1中输出:%d\n",x);
}
void MyFun2(int x)
{
        printf("函数MyFun2中输出:%d\n",x);
}
void MyFun3(int x)
{
        printf("函数MyFun3中输出:%d\n",x);
}
 

执行结果:

 

[root@xhu-vm test]# ./test4
函数MyFun1中输出:10
函数MyFun2中输出:20
函数MyFun3中输出:30

 

 

 

 

分享到:
评论

相关推荐

    C语言进阶-第一讲概述.pdf

    ### C语言进阶:第一讲概述 #### 关于本课程 本课程专为希望深入了解C语言在嵌入式系统中应用的学生设计。C语言因其灵活性和高效性,在嵌入式领域占据重要地位,但同时也因其复杂性和潜在的陷阱而被称为“世界上...

    C语言进阶-第二讲C语言复习.pdf

    ### C语言进阶——第二讲C语言复习 #### C语言概览 C语言是一种广泛使用的通用编程语言,尤其适用于系统编程、嵌入式系统开发等领域。本次讲座将围绕C语言的关键概念和技术要点展开讨论。 #### C语言的历史背景 ...

    程序设计入门—C语言(完)-浙江大学-翁恺 视频.txt

    对于计算机相关专业而言,程序设计是专业基础知识,是进一步学习其他专业知识的第一步阶梯;对于非计算机专业而言,程序设计的学习有助于理解计算机的能力所在,理解哪些是计算机擅长解决的问题,怎样的方式方法是...

    尚观培训linux许巍老师关于c语言的课程笔记和讲义

    这些文件可能按照从基础知识到高级特性的顺序排列,逐步引导学习者掌握C语言。 此外,提到的"嵌入式Linux驱动开发"意味着这份资料可能还会涉及到C语言在Linux环境下的应用,包括如何编写设备驱动、理解和使用Linux...

    哈工大计算机复试C语言复习笔记 1

    【哈工大计算机复试C语言复习笔记 1】 在计算机科学领域,C语言是一门基础且重要的编程语言,尤其在哈工大的计算机专业考研复试中,掌握C语言的知识显得至关重要。本复习笔记主要涵盖以下几个核心章节,旨在帮助有...

    AKA Linux编程系列讲座第二期的所有资料

    这个系列讲座的第二期是一个精心设计的教程,旨在为初学者提供一个全面且详细的指导,涵盖了大量的理论知识和实践案例。通过这份资料,您可以逐步掌握Linux编程的基础,从而更好地理解和创建在Linux环境中运行的应用...

    linux操作与c基础复习文档

    ### Linux 操作与 C 语言基础复习文档 #### Linux 基础操作 **1.... - **Ctrl+Alt+t**:打开终端窗口。 - **Ctrl+Shift+n**:在当前目录下打开一个新窗口...希望这份复习文档能帮助大家更好地理解这两个领域的基础知识。

    如何快速上手嵌入式Arm-Linux.pdf

    - **参考视频:** 韦东山视频第一期以及国嵌精通嵌入式系列教程的第一季和第二季。 - **建议时间:** 至少一个月,确保每个模块都有深入的理解和实践。 ##### U-Boot、Linux Kernel与文件系统 (18%) **学习内容:** ...

    embedded Linux大纲

    #### 第1章 Linux基础 - **目标**: - 独立安装Linux操作系统。 - 熟练使用Linux系统的基本命令。 - 认识Linux系统的常用服务。 - **主要知识点**: - **了解并认识Linux操作系统**:介绍Linux的历史、版本、...

    C语言期末复习题[参照].pdf

    操作系统是计算机系统中的核心软件,它管理和控制着计算机硬件和软件资源,为用户提供服务和应用程序的...在准备C语言期末复习时,这些知识点将帮助学生全面掌握操作系统的基础知识,并为后续深入学习打下坚实基础。

    C语言程序的设计复习试题库完整.docx

    - C语言中数组的下标是从0开始的,这意味着数组的第一个元素对应的下标是0,而不是1。 3. **函数的组成部分**: - C语言中的函数通常由两个部分组成:函数首部和函数体。 - 函数首部包括函数类型、函数名称以及...

    嵌入式linux教程 第二版pdf

    这本书详尽地介绍了嵌入式Linux的基础知识、开发环境的搭建、内核配置与裁剪、驱动程序开发以及应用程序设计等多个方面,是学习嵌入式Linux领域的宝贵资料。 首先,我们要理解嵌入式Linux的概念。嵌入式Linux是指将...

    linux操作系统+linux下编程+实验报告及代码和操作过程+期末复习

    通过这个实验,学生不仅能巩固C语言的基础知识,还能提升在Linux操作系统中的实际编程技能,学会使用Makefile组织和管理项目,以及使用gdb进行程序调试。这对于今后的软件开发和系统级编程工作具有重要的实践价值。

    C-Primer-Plus(第6版)(中文版)1

    《C-Primer-Plus(第6版)(中文版)1》是一本关于C语言编程的入门书籍,适合初学者了解和学习C语言的基础知识。书中涵盖了C语言的起源、特性和应用范围,以及如何使用C语言进行程序设计的全过程。 1. C语言的起源:...

    21天学通Linux C编程(第2版)光盘内容

    《21天学通Linux C编程(第2版)》是一本旨在帮助初学者快速掌握Linux环境下C语言编程技能的教程。光盘内容包括了学习过程中至关重要的辅助材料,如电子教案(PPT)、习题参考答案以及源代码,这些资料对于深入理解...

    嵌入式linux应用程序开发详解

    以上内容涵盖了从Linux基础知识到嵌入式系统开发的各个环节,为读者提供了一条系统学习路径。通过这些知识点的学习,读者不仅可以掌握Linux的基本操作和应用,还能深入了解嵌入式Linux系统的开发流程和技术细节。

    Linux 环境c程序设计源码+ppt(第二版)

    《Linux环境C程序设计》是徐诚先生在清华大学出版社出版的第二版教材,该书深入浅出地介绍了在Linux操作系统下进行C语言编程的基础知识和高级技巧。此资源包含源码和PPT,为读者提供了丰富的实践材料和教学辅助资料...

    最全的《嵌入式Linux应用程序开发标准教程》(第2版)PDF文档

    《嵌入式Linux应用程序开发标准教程》(第2版)是一本全面介绍嵌入式Linux系统下应用程序开发的专业教程,适合初学者和有一定基础的开发者深入学习。全书分为12个章节,覆盖了从基础知识到高级应用的广泛内容,旨在...

    2023年c语言电大语言程序设计A复习资料.doc

    1. 第一个程序段会计算0到9中奇数的和(`s1`)和偶数的和(`s2`),输出为`25 30`。 2. 第二个程序段的`const int M=20;`定义了一个常量`M`,但由于未提供完整代码,无法确定输出。通常,这样的程序段会继续定义和...

    NOIP普及组初赛C语言试题及复习资料.doc

    【知识点详解】 1. 图灵机:图灵机是一个理论上的...这些知识点涵盖了计算机基础知识,如计算模型、内存、操作系统、网络协议、编程语言、数据结构、算法等,对于准备NOIP普及组初赛C语言试题的考生来说是非常重要的。

Global site tag (gtag.js) - Google Analytics