Linux C基础笔记(4)终结篇

补充申明:Linux C基础笔记共分为四部分,第一部分是Linux下基本命令,以及vi编辑器的使用还有C中的数据类型,第二部分为运算符、常量变量和输入输出。第三部分是控制语句、数组、字符串函数。第四部分为指针、函数以及分配内存管理。在写完这四部分之后我会继续上传数据结构、IO、以及网络编程的学习笔记,大家如果有需要学习Linux下编程的可以关注一下,我会将我所有的学习笔记发布在此供大家一起学习。(在笔记里面会有一些其他博主的总结,如果涉及到实属抱歉,您可以通过邮箱联系我,我会及时修改。1509965601@qq.com)。

  • 指针

- 【1】定义

 在计算机内部存储器(简称内存)中,每一个字节单元,都有一个编号,称为地址。
在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,称为指针变量(pointer variable)。
在不影响理解的情况中,有时对地址、指针和指针变量不区分,通称指针。一般形式 :<存储类型><数据类型> *<指针变量> = <地址量>  int a, *p = &a;  ==  int *p; p=&a;

【2】&和*

&:取一个变量的地址,常量不能取地址
*:在定义指针变量的时候,起到标识作用,标识定义的是一个指针变量其他地方都表示取地址的内容

【3】指针变量的运算

指针变量的运算依据指针变量的类型来决定

【4】指针的运算

指针运算是以指针变量所存放的地址量作为运算而进行的运算
指针运算的实质就是地址的计算
指针运算的种类是有限的,他只能进行赋值运算、算术运算和关系运算。int *p;
p + n  向地址大的方向移动n个数据
p + 1  向地址大的方向移动4个地址(一个数据类型的大小)
p - 1  向地址小的方向移动4个地址
p++    自增  向地址大的方向移动1个数据
p--    自减
p - q  两个地址之间相隔数据元素的个数注意:不同数据类型的两个指针实行加减整数运算是无意义的。

【5】指针与数组

数组指针: 实际上是一个指针,该指针指向一个数组       int (*arr)[4];  int a[3][4]; int (*p)[4];     arr指向含有4个int型元素的一维数组变量整体,其类型为可存储4个int型数据的数据类型。 指针数组:(将多个字符串赋值给数组时,选用) 实际是一个数组,数组的每个元素存放的是一个指针类型的元素    int* p[8]; int a[8][3]; p[1] = a[1];   p是一个指针含有8个int*的数组,数组元素类型是int指针类型。指针与一维数组 int a[4], *p;p = a; p = &a[0];a[i] <=> *(a + i) <=> *(p + i) <=> p[i]例子: main(){int a[5] = {1,2,3,4,5};int *p = (int *)(&a + 1);printf("%d %d0",*(a+1),*(p-1))}输出  2  5指针与二维数组int a[3][4]; int (*p)[4];<=> int *p = &a[0][0]&a  地址升级,指向整个数组      &a+1 移动整个数组大小的字节a  行指针,指向一行*a   列指针,地址的降级,指向一个数据*a = a[0];a[i][j] <=> *(*(a + i) + j) <=> *((p + i) + j)<=>p[i][j];p = a[0] = &a[0][0];

【6】字符指针与字符串

初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中
当一个字符指针指向一个字符串常量时,不能修改指针指向的对象值  可修改
char str[] = "hello";
char *p = str;不可修改
char *p = "hellochar ch1[] = "hello";
char ch2[] = "hello";
char *p;
p = ch1 / p = ch2; 其中ch1和ch2的地址不同char *p = "hello";
char *q = "hello"; 其中p和q的地址一样
  • 函数

【1】定义

函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。
一般形式如下:
<返回值类型>  <函数名称>( <形式参数说明> )
{语句序列;return[(<表达式>)];
}

【2】函数的参数传递方式:

值传参
地址传参

【3】函数的数组传参方式

int a[4];
void order(int a[],int size);
void order(int *a);从函数返回数组C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。int * getRandom( ){static int  r[10] = {1,2,6,6,5,4,4};return r;}int main (){  /* 一个指向整数的指针 */int *p;int i;p = getRandom();for ( i = 0; i < 10; i++ ){printf( "*(p + %d) : %d\n", i, *(p + i));}return 0;}这个方法实际是我们下面讲到的指针函数。

【4】递归函数

C 语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。
递归函数在解决许多数学问题上起了至关重要的作用,比如计算一个数的阶乘、生成斐波那契数列,等等。#include <stdio.h>
double fun( int i)
{if(i <= 1)
{return 1;}return i * fun(i - 1);
}
int  main()
{int i = 10;printf("%d 的阶乘为 %f\n", i, fun(i));return 0;
}

【5】指针函数

如果一个函数的返回值是指针,则称函数为指针函数。char *mystring(void){static char str[N];char *str = "hello";  //此str 不可修改return str;}

【6】函数指针

函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针变量的声明: typedef int (*fun_ptr)(int,int);int max(int x, int y)
{return x > y ? x : y;
}int main(void)
{/* p 是函数指针 */int (* p)(int, int) = & max; // &可以省略int a, b, c, d;printf("请输入三个数字:");scanf("%d %d %d", & a, & b, & c);/* 与直接调用函数等价,d = max(max(a, b), c) */d = p(p(a, b), c); printf("最大的数字是: %d\n", d);return 0;
}

【7】回调函数

函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
// 回调函数
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{for (size_t i=0; i<arraySize; i++)array[i] = getNextValue();
}// 获取随机值
int getNextRandomValue(void)
{return rand();
}int main(void)
{int myarray[10];populate_array(myarray, 10, getNextRandomValue);for(int i = 0; i < 10; i++) {printf("%d ", myarray[i]);}printf("\n");return 0;
}#include<stdio.h>
int fun(int a,int b)
{int c;c = a+b;return c;
}int fun1(int a,int c,int d,int (*fun)(int a,int b))
{int sum;sum = a + fun(c,d);return sum;
}int main()
{int sum;sum = fun1(10,2,1,fun);printf("%d\n",sum);}

因为时间关系,今天的笔记就码到这里,给大家说好的还有动态分配空间我会放到后边的结构体里。(小声哔哔:反正也没人看。(꒦_꒦) )

Linux C基础笔记(4)终结篇相关推荐

  1. Linux C基础笔记(3)

    Linux C基础笔记(3) 补充申明:Linux C基础笔记共分为四部分,第一部分是Linux下基本命令,以及vi编辑器的使用还有C中的数据类型,第二部分为运算符.常量变量和输入输出.第三部分是控制 ...

  2. Linux C基础笔记(2)

    Linux C基础笔记(2) **补充申明:Linux C基础笔记共分为四部分,第一部分是Linux下基本命令,以及vi编辑器的使用还有C中的数据类型,第二部分为运算符.常量变量和输入输出.第三部分是 ...

  3. Linux C基础笔记(1)

    Linux C基础笔记(1) [1]四个重要的人物 肯.汤姆森:B语言发明者,C语言发明者,UNIX发明者,AT&T 丹尼斯.里奇:C语言之父,UNIX 之父 理查德.斯托曼:自由软件之父,l ...

  4. 萌新linux的基础笔记

    笔记下载 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 命令 vim vim命令 前言 一个萌新写的linux的基础笔记 命令 ls //查看当前目录文件夹与文件 ...

  5. Linux调度系统全景指南(终结篇)

    点击上方蓝字关注公众号,更多经典内容等着你 | 导语本文主要是讲Linux的调度系统, 本篇是终结篇,主要讲当前多核系统调度策略和调度优化,调度可以说是操作系统的灵魂,为了让CPU资源利用最大化,Li ...

  6. Linux:基础笔记

    Linux:基础详细版 Linux基础知识: 文件信息: Linux是一个以根目录为核心,多个子目录和软链接组成的操作系统 linux中不同类型文件的颜色: 白色:普通文件 蓝色:目录 绿色:可执行文 ...

  7. 【Python零基础入门之终结篇】:虚拟机Linux命令、Vim编辑器、有趣的命令

    目录 一.虚拟机Linux命令 1.基本命令 常用命令 文件操作命令 2.通过代码演示了解基本命令的使用 pwd.ls.ls -a 命令的使用 cd 目录名.cd 命令的使用 tab:自动补全命令 c ...

  8. linux驱动内核,Linux内核设备驱动之Linux内核基础笔记整理

    1. Linux内核驱动模块机制 静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载 2. 编写内核驱动 #include #includ ...

  9. linux编程基础_第1篇 Linux系统编程 -多线程基础

    进程 在理解线程之前,首先需要了解UNIX/Linux进程. 进程是由操作系统创建的,需要相当数量的"开销". 进程包含有关程序资源和程序执行状态的信息,包括:它是一个在随机访问内 ...

最新文章

  1. 文巾解题 567. 字符串的排列
  2. IDEA中安装Free Mybatis plugin插件实现从dao层到mapper层自由跳转
  3. OpenGL散射照明
  4. 通电后第一次开机黑屏_电脑无法开机怎么办,8 种情况的修复方法
  5. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
  6. 文章之间的基本总结Activity生命周期
  7. ssis 派生列_具有多个表达式与多个转换的SSIS派生列
  8. linux查询表空间脚本,通过Shell脚本查看数据库表空间使用情况
  9. 工具的使用——谷歌浏览器(chrome) (二)
  10. macOS版本大升级,这几项的细节值得你关注
  11. java 快速排序流程图_java简单快速排序实例解析
  12. 脚本实现为一系列账号生成随机密码
  13. java贪吃蛇难度设计_Java贪吃蛇应用的设计与实现
  14. 英语论文拟定论文标题的基本原则
  15. 互联网公司数据产品经理和数据分析师,主要有什么区别?
  16. 如何解决“无法连接到文件共享,因为它不安全。 此共享需要旧的 SMB1 协议”问题
  17. 参加门票6800的QCon大会,是怎样的体验?
  18. XILINX DDR4 SDRAM(MIG)笔记2(基于VU9P FPGA)
  19. 全球与中国扩管器驱动市场深度研究分析报告
  20. 人机协作机器人发展趋势_未来10年机器人三大发展趋势

热门文章

  1. 限流算法-令牌桶算法
  2. Spring项目在启动时报Error running 'ProviderC': Cannot start process, the working directory 'E:\ ' does not
  3. 电脑护眼模式_2020年双11护眼仪/眼部按摩仪推荐 |护眼仪/眼部按摩仪选购指南 |高性价比护眼仪推荐...
  4. 使用ThreadLocal和AtomicInteger将int属性改为线程安全的计数器
  5. 离开页面前onbeforeunload事件在火狐的兼容并且提交不触发
  6. java中类和实例化_Java中类的初始化与实例化
  7. 如何查找MySQL中查询慢的SQL语句
  8. c#里面的combobox在代码中怎么根据它的text获取它的index?
  9. Android开发笔记(一)像素的单位
  10. 知识总结和记录——递归