地址和指针
指针的一般形式:类型说明 *变量名(*表示该变量是一个指针变量,变量名即为定义的指针变量名,类型说明表示指针变量所指向的变量的数据类型)
指针变量和普通变量一样,使用前需定义并赋值
& 变量名 如&a表示变量a的地址,及地址运算符
&和*的运算符优先级别相同,按自左向右的方向结合
传递指针给函数:
定义函数无非就是对一些数值进行修改,当把函数的参数定义为所需修改的变量类型的指针时,则对指针进行相应的赋值就行,然后调用函数时参数改为需修改的变量的存储值即&变量
要循环数组是也需记得定义一个相应类的指针,通过数组对指针进行循环,数组不能直接循环,因为数组是常量指针。
C 不支持在调用函数时返回局部变量的地址,除非定义局部变量为 static 变量。
因为局部变量是存储在内存的栈区内,当函数调用结束后,局部变量所占的内存地址便被释放了,因此当其函数执行完毕后,函数内的变量便不再拥有那个内存地址,所以不能返回其指针。
除非将其变量定义为 static 变量,static 变量的值存放在内存中的静态数据区,不会随着函数执行的结束而被清除,故能返回其地址。
产生随机数的代码
函数指针
数组和指针
当定义一个一维数组是,系统会在内存中为该数组分配一个存储控件,其数组的名称就是数组在内存中的首地址。若定义一个只争变量,并将数组的首地址传给指针变量,则该指针就指向了这个一维数组
输入输出
字符串输入输出:(需要添加头文件stdio.h)
输出单个字符:putchar
输入单个字符:getchar(得到的字符可以赋给一个字符变量或整型变量)
字符串输出:puts(会自动在字符串后加\0即自动换行)
字符串输入:gets函数,字符类型(语法格式char *gets(char *str))
格式输出函数:输入、输出函数scanf和printf
printf函数的格式字符:
scanf函数(一般格式scanf(格式控制,地址列表))
循环控制
转移语句:
goto 标识符;无条件转移语句,即可令程序立即跳转到函数内部的任意一条可执行的语句。
break语句,跳出所有循环
continue语句,跳出所有循环
字符串处理函数
字符串复制(需先添加头文件string.h):
字符串复制,strcpy(目的字符数组名, 源字符数组名)
字符串连接,strcat(str1, str2),输出str1
字符串比较,strcmp(字符数组名 1, 字符数组名2)
字符串1等于字符串2,返回值0
字符串1大于字符串2,返回值为正数
字符串1小于字符串2,返回值为负数
字符串大小写转换,大写Strupr(字符串)
小写strlwr(字符串)
获得字符串长度:strlen(字符数组名)
内部函数和外部函数
内部函数:在函数的返回类型前加上关键字static,就将原来的函数修饰成内部函数(内部函数只能在所在的源文件中使用)
外部函数:外部函数是可以被其他源文件调用的函数,定义外部函数使用关键字extern进行修饰
头文件的引入
主要:
解决scanf使用问题
声明#define _CRT_SECURE_NO_WARNINGS
结构体
Stuct 结构体名{
成员列表
}变量名列表;
变量可直接访问结构体的成员列表
Struct 结构体名{
成员列表
}结构体数组;
Struct 结构体名{
成员列表
}结构体数组={初始值列表};
结构体指针
结构体类型 *指针名
(*pStruct).成员名
字符串
C typedef
typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
预处理器
需要记住得到要点
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
局部变量要定义在方法前面
C语言中用char *string代替string,输出用string就行
注:多文件管理的时候,在头文件里面声明自定义函数(例a.h)
在C语言文件里写下自定义函数的实现(b.h)
在主函数中调用函数(要引入b.h)