
C语言
同名公众号 - 人生代码
这个作者很懒,什么都没留下…
展开
-
free函数的使用
前面定义了一个指向动态内存的指针变量p:int *p = malloc(sizeof *p);前面讲过,动态分配的内存空间需要程序员手动编程释放。那么怎么释放呢?使用free函数。free函数的原型:#include<stdlib.h>void free(void *p);free函数无返回值,他的功能是释放指针变量p所指向的内存单元。此时p指向的那个内存单元将会被释放并...原创 2019-05-21 21:52:54 · 13074 阅读 · 0 评论 -
字符串输出函数puts()
前面在输出字符串时都使用printf,通过“%s”输出字符串,其实还有更简单的方法,就是使用puts()函数,该函数的原型为:#include<stdio.h>int puts(const char *s);这个函数也很简单,只有一个参数。s可以是字符指针变量,字符数组名,或者直接是一个字符串常量。功能就是将字符串输出到屏幕。输出时只有遇到’\0’也就是字符串结束标志符才会停止...原创 2019-05-26 14:35:16 · 2825 阅读 · 0 评论 -
字符串复制函数strcpy()
两个字符串变量不可以使用“=”进行直接赋值,只能通用strcpy()函数进行赋值。strcpy是 string copy的缩写,即“字符串复制”。他的原型是:#include<stdio.h>char *strcpy(char *dest, const char *src);功能是将指针变量src所指向的字符串复制到指针变量dest所指向的位置,dest和src可以是字符数组名...原创 2019-05-26 14:58:31 · 26457 阅读 · 1 评论 -
字符串复制函数strncpy()和内存拷贝函数memcpy()
#include<string.h>char *strncpy(char *dest, const char *src, unsigned long n);功能是将指针变量src所指向的字符串复制到指针变量dest所指向的位置。而strncpy()的功能是将指针变量src所指向的字符串的前 n 个字符串复制到指针变量dest所指向的位置。只要将strcpy()掌握之后,strnc...原创 2019-05-26 15:39:33 · 2786 阅读 · 0 评论 -
字符串比较函数strcmp()
strcmp是 string compare的缩写,即“字符串比较”。他的原型是:#include<string.h>int strcmp(const char *s1, const char *s2);功能是比较 s1和s2所指向的字符数组中的字符串,返回一个int型值。s1和s2可以是字符数组名或者字符指针变量名。...原创 2019-05-27 08:16:41 · 3420 阅读 · 0 评论 -
为什么需要结构体
结构体很重要,一定要掌握,但是在很多C语言书中结构体的内容讲的很少,因为从结构体开始,后面介绍的内容已经超过C语言的基础范畴了,属于C语言的高级部分。但是在实际开发中,真正的核心的部分正是从这里开始的。而且结构体会影响到对数据结构和面向对象的学习。。首先数据结构里面都是链表,所以必须要学结构体,其次如果以后学习C++或者java,那么就必须了解C语言中的结构体,因为面向对象的思想就是从结构体升华...原创 2019-05-27 08:34:24 · 2093 阅读 · 0 评论 -
指针变量的自增运算
前面说过,p+1表示指向数组中的第二个元素。p = p+1也可以写成p++或++p,即指针变量也可以进行自增运算。当然,也可以进行自增运算。自增就是指针变量向后移动,自减就是指针变量向前移动。#include<stdio.h>int main(void){ int a[] = {2, 5, 8, 7, 4}; int *p = a; printf("*p++ = %d, *...原创 2019-05-17 19:41:30 · 4033 阅读 · 2 评论 -
练习
编程要求:实现从键盘输入10个数,然后输出最大的偶数,要求使用指针访问数组。#include<stdio.h>int main(void){ int a[10] = {0}; int *p = a; int max; int i; int flag = 1; printf("请输入十个整数:"); for(i=0; i<10; ++i) { scanf...原创 2019-05-17 20:25:56 · 411 阅读 · 0 评论 -
两个参数确定一个数组
在函数调用时如果要将一个数组从主调函数传递到被调函数,并不是需要将数组中的所有元素一个一个全部传递过去,只需要传递两个参数就能知道整个数组的信息,一个是一维数组的首地址,即数组名,另一个是一维数组的元素的个数,即数组长度。#include<stdio.h>void Output(int *p, int cnt);int main(void){ int a[] = {1,2,3...原创 2019-05-17 20:49:08 · 734 阅读 · 0 评论 -
使用gets()和fgets()前注意吸收回车
当使用gets()和fgets()给字符数组赋值时,如果前面使用过scanf,那么scanf遗留下来的回车将会被他们取出来并赋值给该字符串,并且只能获取这个回车符,从而导致字符数组赋值失败,#include<stdio.h>int main(void){ int i; char str[10]; scanf("%d", &i); gets(str); print...原创 2019-05-26 14:24:56 · 5239 阅读 · 0 评论 -
优先使用fgets()函数
虽然用gets()时有空格也可以直接输入,但是 gets()函数有一个非常大的缺陷,即他不检查预留存储区是否能够容纳实际输入的数据,这样很不安全。如果输入的字符数目大于数组的长度,就会发生内存越界,所以编程时建议使用fgets();#include<stdio.h>char *fgets(char *s, int size, FILE *stream);fgets()虽然比ge...原创 2019-05-26 11:31:05 · 571 阅读 · 0 评论 -
字符串输入函数gets()
在前面讲过键盘输入函数 scanf 和 %s.其实还有更简单的方法,就是使用 gets() 函数,该函数的原型为:#include<stdio.h>char *gets(char *str);这个函数很简单,只有一个参数,参数类型为char *型,即 str 可以是一个字符指针变量名,也可以是一个字符数组。gets()函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量...原创 2019-05-26 10:40:33 · 10120 阅读 · 0 评论 -
指针和一维数组的关系
指针和数组的关系是比较高级的内容,他分为指针和一维数组的关系,指针和一维数组的关系。其中前者是重点,而且更复杂一点。我们主要掌握指针和一维数组的关系。二维数组本身就用的比较少,指针和二维数组的关系用得就更少了。指针和二维数组的关系我们后面会讲到,但是不是重点。用指针引用数组元素引用数组元素可以用“下标法”,这个在前面已经讲过了,也用过了,但是除了这种方法之外还可以使用指针,即通过指向某一个元素...原创 2019-05-16 20:24:18 · 2122 阅读 · 0 评论 -
指针的移动
那么如何使指针变量指向一维数组的其他元素呢?比如如何使指针变量指向 a[3],同样可以写成p = &a[3],但是除了这种方法之外,C语言规定:如果指针变量p已经指向一维数组的第一个元素,那么p+1就表示指向该数组的第二个元素。注意,p+1不是指向下一个地址,而是指向下一个元素。“下一个地址”和“下一个元素”是不同的。比如int类型数组中每一个元素都占 4 字节,每一个字节都有一个地址,所...原创 2019-05-16 21:17:29 · 2247 阅读 · 0 评论 -
练习-动态数组的构建
前面用malloc动态创建了4字节的内存空间,那么如何用malloc动态创建20字节的内存空间给5个int型变量使用呢?int *p = malloc(20);int *p = malloc(sizeof(*p) * 5);动态内存是通过指针变量存储数据的,当一个指针变量指向一个动态内存之后,这个动态内存存储数据时根据的是指针变量的基类型。比如上面这个指针变量p的基类型是 int 类型,...原创 2019-05-22 08:09:15 · 502 阅读 · 0 评论 -
指针和指针变量
为了表示指针变量和他所指的变量之间的联系,在程序中用“*”表示"指向",如果定义变量 i 为指针变量,那么 *i 就表示指针变量 i 里面存放的地址所指向的存储单元里面的数据,很绕吧,可以在纸上画一画。...原创 2019-05-12 22:06:11 · 3032 阅读 · 1 评论 -
初始化内存函数:memset()
定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存比较大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。每种类型的变量都各自的初始化方法,memset()函数可以说是初始化内存空间的“万能函数”,通常为新申请的内存进行初始化工作,他是直接操作内存空间的,mem即是“内存”的意思,该函数的原型:#include<string.h>...原创 2019-05-26 08:19:16 · 2206 阅读 · 0 评论 -
用scanf输入字符串
#include<stdio.h>#include<string.h>int main(void){ char str[10]; printf("请输入字符串:"); scanf("%s", str); printf("输出结果:%s\n", str); return 0;}原创 2019-05-26 08:25:59 · 6146 阅读 · 0 评论 -
字符串与指针
在C语言中,有两种方法存储和访问一个字符串,一个是用字符数组,二是用字符指针,指向一个字符串。字符指针首先是一个指针变量,所以要有“指针运算符*”;其次指针变量里面存放的是地址,这一点一定要明确,最后他是字符,所以要用 char 类型。#include<stdio.h>int main(void) { char *str = "I Love You Mom!"; print...原创 2019-05-26 10:08:08 · 671 阅读 · 0 评论 -
如何使用scanf给字符指针变量所指向的内存单元初始化
首先要明确一点是:scanf只能给字符指针变量所指向的内存单元初始化,不能给字符指针变量初始化,其次:在用scanf给字符指针变量所指向的内存单元初始化之前一定要先使字符指针变量明确的指向某个具体的字符数组。#include<stdio.h>int main(void){ char str[30]; char *string = str; printf("请输入字符串:")...原创 2019-05-26 10:16:12 · 2659 阅读 · 0 评论 -
定义和使用结构体变量
声明一个结构体类型struct 结构体名{ 成员列表}比如将学生的信息定义成结构体:struct STUDENT{ char name[20]; int num; char sex; int age; float score; char addr[30];};说明:1 最后的分号千万不要省略。2 结构体类型是由一些基本数据类型组合而成的新的数据类型。因为结构体...原创 2019-05-27 23:29:17 · 3116 阅读 · 0 评论 -
定义结构体类型变量
结构体类型他只是一种类型,与 int,float,char,double一样,并没有具体数据,系统也不会给他分配内存,要想在程序中使用“结构体类型”数据,必须定义“结构体类型变量”,并在其中存放具体数据,一定要弄清楚“结构体类型”和“结构体类型变量”的区别。这个问题很重要,也很简单,就比如:int a;其中, int 就是类型, a就是这个类型定义 的变量。结构体也一样。先声明“结构体类型...原创 2019-05-27 23:45:19 · 2549 阅读 · 0 评论 -
队列的定义
队列跟栈很相似,唯一的区别是:无论是插入还是删除,栈只允许在一端进行操作,插入或者删除都只能靠栈顶指针top;而队列只允许在一端进行插入操作,在另一端进行删除操作,相当于将 top 的工作一分为二,也就是说,队列在插入元素时,只能在一端进行,而删除元素时只能在另一端进行。允许插入的一端成为队尾,允许删除一端的称为对头。队列的对头是出队列的位置,队尾是入队列的位置,这是队列的一大特点。...原创 2019-06-07 10:17:48 · 670 阅读 · 0 评论 -
链式队列的基本操作
1 创建队列struct QUEUE * CreateQueue(void);2 判对空int QueueEmpty(struct QUEUE *);3 入栈struct NODE * EnQueue(struct NODE *rear);4 输出整栈void OutputQueue(struct QUEUE *);5 取队列头元素void GetTop(struct N...原创 2019-06-07 10:23:04 · 542 阅读 · 0 评论 -
链式队列程序演示
#include <stdio.h>#include<stdlib.h>struct NODE{ char name[20]; float score; struct NODE *next;};struct QUEUE{ struct NODE *front; struct NODE *rear;};struct QUEUE *CreateQu...原创 2019-06-07 11:06:03 · 642 阅读 · 0 评论 -
GCC
虽然以下这种配置安装方式真的很蛋疼的,当做学习就好,真正安装的时候直接1 ubantu ----> sudo apt-get install gcc / sudo apt-get install gcc++一、简介:gcc 最初是 “GNU C Compiler” 的简称,只是当作一个 C 语言的编译器,现在已经变成了 “GNU Compiler Collection”,可...原创 2019-06-07 11:27:28 · 4242 阅读 · 0 评论 -
结构体数组
结构体数组的定义与引用一个结构体变量可以存放一个学生的一组信息,可是如果有10个学生?难道要定义10个结构体变量?,很明显不现实,这时就要使用数组。结构体中也有数组,称为结构体数组。他与前面讲过的数组类型几乎一摸一样,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项。定义结构体数组的方法很简单,同定义结构体变量一样的,只不过将变量改成数组。或者说桶...原创 2019-05-29 20:46:22 · 7710 阅读 · 2 评论 -
结构体数组定义时初始化
结构体数组的初始化与前面讲的数值型数组的初始化是一模一样的,数值类型数组初始化的方法需要注意的是在结构体数组的初始化中同样适用,因为不管是不是数值型数组还是结构体数组都是数组。#include<stdio.h>#include<string.h>struct STU{ char name[20]; int age; char sex; char num[20...原创 2019-05-29 21:02:11 · 7264 阅读 · 0 评论 -
栈的基本操作
栈有7种基本操作:1 构造空栈struct STACK *CreateStack(void); //空栈指的不是很多节点,然后都是空的,而是指的是只有一个结点。如果要压栈则随即增加结点。2 判断空栈int StackEmpty(struct STACK *); // 如果头结点的地址等于尾结点地址说明栈是空栈3 入栈struct NODE *Push(struct NODE *);...原创 2019-06-02 09:46:29 · 5659 阅读 · 0 评论 -
链栈程序演示
链栈本质就是操作链表。链栈是怎么实现的呢?通过栈顶指针top和栈底指针bottom,只要创建一个头结点,然后使得top和bottom都指向这个头结点,那么栈就被创建了,就这么简单,可以说,整个链栈的创建和操作都是通过指针来完成的。在写程序的时候,所有程序不要定义成结构体变量,而是定义成结构体指针。需要注意的是,头结点是不存放任何数据的,只存放指向首结点的指针,同链表中一样,定义这样一个不存放...原创 2019-06-02 10:37:12 · 741 阅读 · 0 评论 -
栈的定义
那么到底什么是栈?栈是一种特殊的线性表。他是一种可以实现“先进后出”的数据结构,或者说存储方式。即first in last out.栈的特殊性就在于限定了插入和删除数据的操作只能在线性表的一端进行。也就是说,栈只有一个入口,也只有一个出口。只能在一个位置进行操作。而队列则不同,队列可以在线性表的两端进行操作,也就是说可以在两个位置进行操作。链表可以在任何位置进行操作,所以说链栈和链式队列是对...原创 2019-06-01 21:07:01 · 728 阅读 · 0 评论 -
内存的分区
1 栈区在代码执行阶段由系统自动分配和释放,存放局部变量和函数形参等,主要作用于复合语句和函数体内,在复合语句或函数执行结束后就会被释放。其操作方式类似于数据结构中的栈。栈区的空间有限,windows下一般是1MB或者2MB,linux下一般是8MB。所以如果程序中定义数组元素的数量超过一定限度的话,编译时就会报“溢出”警告。此外栈的申请速度比较快,堆比较慢。2 堆区在代码执行过程中由程序员...原创 2019-06-01 20:43:28 · 988 阅读 · 0 评论 -
链表的定义和分类
链表定义1 他是不连续存储的,也就是说他是离散的2 他是通过指针链接在一起的3 指向唯一链表分类上面是单向链表上面是双向列表原创 2019-06-01 19:21:17 · 915 阅读 · 0 评论 -
结构体变量可以进行哪些运算
结构体变量不能相加,相减,也不能相互乘除,但结构体可以相互赋值,也就是说,可以将一个结构体变量赋值给另一个结构体变量。但是前提是这两个结构体变量的结构体类型必须相同。...原创 2019-05-27 23:48:50 · 3179 阅读 · 0 评论 -
结构体变量的初始化-定义时初始化
可以在定义时或者定义之后对结构体。一般情况下我们都是在定义的时候对他进行初始化,因为那样比较方便,如果定义之后再进行初始化,那就只能一个一个成员进行赋值,就如同数组一样,数组只能在定义的时候才可以一次性对所有元素进行初始化,如果定义之后再初始化就只能一个一个的赋值了,那样比较麻烦。#include<stdio.h>struct AGE{ int year; int month...原创 2019-05-28 07:39:34 · 5452 阅读 · 0 评论 -
结构体变量的引用
定义了结构体变量之后就可以在程序中对他进行引用,但是结构体变量的引用同一般变量引用不太一样,因为结构体变量中有多个不同类型变量,所以结构体变量不能整体引用,只能一个一个成员的引用。1 只能分别单独引用他内部的成员。结构体变量名.成员名student1.num = 172041;2 如果结构体类型中的成员也是一个结构体类型,则要使用若干个".",一级一级的找下去。因为只能对最低级的成员进行...原创 2019-05-28 08:10:56 · 8241 阅读 · 1 评论 -
指向结构体数组的指针
我们知道,结构体数组的每一个元素都是一个结构体变量。如果定义一个结构体指针变量并把结构体数组的数组名付给这个指针变量的话,就意味着将结构体数组的第一个元素的地址,即第一个结构体变量的地址,也即第一个结构体变量中成员的地址付给这个指针变量。#include<stdio.h>struct STU{ char name[20]; int age; char sex; char ...原创 2019-05-31 06:52:50 · 8115 阅读 · 0 评论 -
结构体变量和结构体指针变量作为函数参数
#include<stdio.h>#include<string.h>struct AGE{ int year; int month; int day;};struct STU{ char name[20]; int num; struct AGE birthday; float score;};void InputStu(struct ST...原创 2019-05-31 07:05:28 · 1932 阅读 · 0 评论 -
结构体变量的初始化-先定义后初始化
1 直接初始化了解结构体变量的引用之后,下面演示一下如何定义后再初始化#include<stdio.h>#include<string.h>struct AGE{ int year; int month; int day;}struct STUDENT{ char name[20]; int num; struct AGE birthday; ...原创 2019-05-28 21:48:50 · 3548 阅读 · 0 评论 -
结构体字节对齐
struct STUDENT{ char a; int b;}data;如上结构体变量data占多少字节?char占1个字节,int占4个字节,所以总共占 5 个字节。#include<stdio.h>struct STUDENT{ char a; int b;}data;int main(void){ printf("%p, %p \n", &d...原创 2019-05-28 22:22:06 · 756 阅读 · 0 评论