C语言笔记:浅谈入门C语言

前言,用VS编C需要用的一些声明:
#define _CRT_SECURE_NO_DEPRECATE(这样就可以使用scanf)
scanf读数据的时候不要加\n!这样会导致编译器需要你输入字符才会读取下一行代码,因为本身你要按回车才会进行读操作!这也是新手一般会犯的错误(博主是看浙大翁凯老师的视频学的,老师讲的很好!水平确实高哈,值得推荐)
指针
1.定义:是用来保存地址的变量
2.指针的值即地址
3.*是一个单目运算符,用来访问指针的值所表示地址上的变量
4.常见错误,定义了一个指针,还没指向其他变量就开始赋值(这是不行的,因为没有指向其他变量的指针,初始是指向一个不知道的地方,也许现在不会错,但是以后用到那个地方的时候,就可能会报错)

应用场景
1.函数返回多个值,某些值就只能通过指针返回
2.函数返回运算的状态,结果通过指针返回(例如除法运算)
指针与数组
1.数组变量是特殊的指针
数组变量本身是地址变量,例 int a[10]; int *p = a;//不用&取地址,a是地址变量
数组的单元表达的是变量,需用&取地址,例 int *p; p = &a[0];//a[0]是int型级 a == &a[0]
2.函数参数表中的数组实际上是指针,例如

2.数组其实是一个常量指针(const),即不能进行赋值改变
3.指针与const,例
int i;
const int p1 = &i;
int const p2 = &i;
int const p3 = &i;
判断哪个被const了的标志是const在
的前面还是后面
4.也可以用
(p + i)遍历数组,例如(因为
p==number[0])
int number[] = {1, 2, 3, 4, 5};
int p = number;
int i;
for (i = 0; i <= 5; ++i) {
printf("%d\n", (p + i));
}
动态内存分配
1.malloc函数
2.引入头文件#include<stdlib.h>
3.Void
malloc(size_t size)
4.向malloc申请空间的大小是以字节为单位的
5.返回的结果是void
,需要类型转化为自己需要的类型
6.(int )malloc(nsizeof(int))注:一定要记得写malloc
7.划重点,如果用了malloc函数 一定要用free
字符串
1.C语言中并没有专门表达字符串的关键字
2.C语言中字符串用char arr[] = “”; || char *arr = “”;
3.字符串在C语言编译中,表示 例
char *arr = “Helloworld”;
char arr[] = {“H”, “l”, “l”, “o”, “w”, “o”, “r”, “l”, “d”, “/0”};
4.常用表示方法char *arr = “Helloworld”;
5.重点:char *arr = “Helloworld”; 指的是arr这个指针初始化指向一个字符串常量,但是实际上这个常量是const型的即const char *arr = “Helloworld”;即这个字符串只能进行读操作!
6.要对定义的字符串进行修改就只能用这种定义方式即:char arr[] = “Helloworld”,与前面一种定义方式不同的是,arr[]是我定义一个字符串是它,*arr是我指向一个字符串是它
7.判断是用指针还是数组定义字符串

字符串输入输出
也可以用scanf读取字符串,但是只能读取一个单词(单词个数根据空格或回车分别),还有就是scanf有个缺点就是它是没有边界的,使用再读字符串的时候要给%s加读取的个数如%7s即读取7个字符(最多)
空字符串:char buffer[100] = “”;
char buffer[] = “”;//这种形式buffer的长度只是为1,只能赋值一个
8.二维数组,第二维必须声明大小即
char a[][10];//这样编译才能通过。但是这种方式定义的二维数组,他的a[0]的长度必须为10不能超过10!
char *a[];//这样编译,它的a[0]就是char *就是一个指针,对字符串长度没有限制
单字符输入输出
1.putchar 和getchar 方法返回类型都是int类型,getchar()传入的参数类型也是int,即会返回一个C语言自己定义的宏EOF,EOF = -1。运行程序时输入Ctrl + Z会让程序返回EOF即-1
字符串函数
1.首先要引入头文件string.h
2.strlen(socnt char *a)函数
3.strcmp(const char *s1, const char *s2)字符串比较函数
返回结果:0: s1 = s2
1: s1 > s2
-1: s1 < s2
注:用==比较两个字符串的时候是指这两个字符串是否是相同的地址
4.break关键字用于跳出当前循环,对于嵌套的循环或switch语句,break直接退出直接包裹它的那一重循环
5.Strcopy,使用如:

即要先定义一个字符串,然后为它分配存储存储空间,存储空间大小可以通过strlen求需要复制的对象,但是要加上最后’/0’即加一!
6.srtca(s1, s2),将s2接到s1后面,所以要求s2要有足够的空间
在这里插入图片描述
枚举
1.枚举是一种用户定义的数据类型,它以关键字enum以如下语法来声明:
enum{名字0, 名字1…名字n};
enum中的值是自动递增的0 1 2 3 4…
2.声明枚举量的时候可以指定值,如:
enum{a = 1, b = 10, c};//此时c是10+1
3.枚举是int类型,一般很少用,只有一些变量排列的定义的时候,可以这样定义
结构
结构体内的变量叫成员变量
1.声明结构的三种形式:
在这里插入图片描述
2.结构体初始化:
在这里插入图片描述
结构与函数
1.想通过方法对结构体的值进行操作,想直接通过传入结构体的名字是不行的,也是要强调的再c语言中函数调用是只传值的
在函数中,只是对结构体的值进行操作,但是退出函数,结构体的值并没有变化,如:
在这里插入图片描述
那么如何解决这中情况,当然用结构指针是绝对可以的,下面讲一种不用指针的方法,即通过在方法中定义一个结构体,如何让这个方法返回结构体,再赋值给需要改变main方法中的结构体变量,例如
在这里插入图片描述
2.所以调用方法,推荐用指针,即指向结构的指针,例如
在这里插入图片描述
现在用指针重做上面的方法,如
在这里插入图片描述
注:记住一句话,传结构不如传指针!
结构中的结构
1.结构数组,例如:struct date dates[100]
struct date dates[] = {{4, 5, 2005}, {2, 4, 20055}};
在这里插入图片描述
注:其中%.2i的意思是按两位数输出,即如果输出的数只有各位,那么向上补0
2.结构中的结构,例如:
在这里插入图片描述
3.结构中的结构的数组
在这里插入图片描述
4.
自定义数据类型(typedef)
1.C语言提供了一个叫typedef的功能声明一个已有的数据类型的新名字,如:
Typede int length;//这样length可以代替int变量出现在变量定义和参数声明的地方,即
Length a;//相当于int a
2.通过使用tyedef定义struct类型改善程序的可行性即:
在这里插入图片描述
联合Union

全局变量
1.全局变量会自动初始化为0,局部变量不会自动初始化,所以没用初始化的全局变量会得到:0值、指针会得到NULL(它的初始化发生在main函数前)
2.如果main函数中有和全局变量名相同的变量,全局变量会隐藏
静态本地变量

  1. 在本地变量定义时加上static修饰符就成为静态本地变量,静态本地变量在离开函数时,会继续存在并保存其值,静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值,如:
    在这里插入图片描述
    2.静态本地变量其实相当于全局变量
    3.静态本地变量与本地变量的区别:静态本地变量本地作用域、全局生存期;本地变量局部作用域、局部生存期。
    注:需要注意的是不要使用全局变量来在函数间传递参数和结果,尽量避免使用全局变量,要通过函数对值进行操作,尽量使用指针!
    编译预处理指令(宏的定义)
    1.#l开头的是编译预处理指令,它们不是C语言的成分,但是C语言离不开它
    2.用#define定义宏
    带参数的宏
    1.定义带参数的宏的原则,一切都需要有括号,整个值要括号,参数出现的每个地方都要有括号,带参数的宏的定义如下:
    #define RADTODEG(x) ((x) * 3.1415)//
    2.#开头的语言。不能加分号!
    3.#include不是用来引入库的,例如:#include<stdio.h>只是为了让编译器知道printf函数的原型,保证调用时给出的参数值时正确的。
    4.不对外公开的函数,在函数前面加上static就使得它成为只能在所在编译单元中被使用的函数
    声明
    1.在写一些比较大型的程序的时候,需要把函数的定义和声明还有main.c分别写,定义写在.c文件中,定义写在.h文件中,这三种文件需要引用.h文件
    2.注:include文件中,很可能会出现一个文件被多次引用,这样会导致多次定义变量,为了避免这种情况出现,需要用带如下预编译指令:
    #ifndef a
    #define a
    #endif
    即标准头文件结构:
    在这里插入图片描述
    格式化输入输出
    1.printf
    %[flags][width][.prec][hIL]type
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    %n的使用:printf(“%d%n”, 12345, &a);//此时a等于5,因为输出的字符的长度为5

2.scanf
%[flag]type
在这里插入图片描述
文件的输入输出
在这里插入图片描述
在这里插入图片描述
按位运算
1.C语言的按位运算:
按位的与:&
按位的或:|
按位取反:~
按位的异或:^
左移:>>
右移:<<
注:大多用于二进制的运算
可变数组(就只贴个声明哈)
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值