基本数据类型
数据类型 | 占用大小 | 取值范围 |
---|---|---|
char | 1字节 | -128 到 127 或 0 到 255 |
int 整型 | 2 或 4 字节(与系统位数有关) | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
short 短整型 | 2 字节 | -32,768 到 32,767 |
long 长整型 | 4 字节 | -2,147,483,648 到 2,147,483,647 |
unsigned int 无符号整型 | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 |
float 单精度浮点型 | 4 字节 | 1.2E-38 到 3.4E+38 |
double 双精度浮点型 | 8 字节 | 2.3E-308 到 1.7E+308 |
地址&指针
- & 表示取变量地址
#include <stdio.h> //引入c头文件
int main ()
{
int num = 10;
int *p; // 定义指针变量
p = #
printf("num 变量的地址: %p\n", p);
return 0;
}
输出 :
num 变量的地址: 0x7ffeeaae08d8
复制代码
- 用星号(*) 修饰的变量表示指针变量,指针指向变量的地址
#include <stdio.h>
int main ()
{
int var = 20; /* 实际变量的声明 */
int *ip; /* 指针变量的声明 */
ip = &var; /* 在指针变量中存储 var 的地址 */
printf("var 变量的地址: %p\n", &var );
/* 在指针变量中存储的地址 */
printf("ip 变量存储的地址: %p\n", ip );
/* 使用指针访问值 */
printf("*ip 变量的值: %d\n", *ip );
return 0;
}
输出:
var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20
复制代码
- 多级指针
多级指针就是指针的指针,对地址再取地址
#include <stdio.h>
int main(void)
{
int i = 10;
int *p = &i;
//二级指针
int **q = &p;
//三级指针
int ***r = &q;
printf("p 地址 %p \n " ,p );
printf("q 地址 %p \n " ,q );
printf("r 地址 %p \n " ,r );
printf("i = %d\n", ***r);
return 0;
}
输出结果是:
p 地址 0x7fff5feef944
q 地址 0x7fff5feef938
r 地址 0x7fff5feef930
i = 10
复制代码
变量 | 值 | 地址 |
---|---|---|
i | 10 | 0x7fff5feef944 |
p | 0x7fff5feef944 | 0x7fff5feef930 |
r | 0x7fff5feef930 | &r |
函数指针&回调函数
函数指针定义 : 返回值(*函数名)(参数…) , 例如 int(*p)(int,int)
#include <stdio.h>
int max(int x , int y ){
return x>y?x:y;
}
int main(void) {
printf("函数指针");
int a,b,c,d;
//定义一个名字为p的函数指针
int(*p)(int,int) =&max;
printf("请输入三个数 :");
scanf("%d %d %d ",&a,&b,&c);
d = p(p(a, b), c);
printf("最大的数字是: %d\n", d);
return 0;
}
输入 : 1 2 3
输出: 3
复制代码
回调函数: 将函数作为参数使用,回调函数就是一个通过函数指针调用的函数。简单来说回调函数是由别人的函数执行时调用你实现的函数。
#include <stdio.h>
int max(int x , int y, int(*action)(int,int)){
return action( x,y);
}
int callback_method(int x , int y){
printf("调用回调函数,返回最大值\n");
return x>y?x:y;
}
int main(void) {
int a,b,c;
//函数指针
printf("请输入两个数 :\n");
scanf("%d %d ",&a,&b);
c = max(a,b,callback_method);
printf("最大值为: %d\n", c);
return 0;
}
请输入两个数 : 4 2
调用回调函数,返回最大值
最大值为: 4
复制代码
结构体 struct
- 结构体
数组可存储相同类型数据项的变量,结构体可存储不同类型的数据项
基本定义:
//注 : tag member-list variable-list 至少要有两个
struct tag {
member-list
member-list
member-list
...
} variable-list ;
复制代码
例子
#include <stdio.h>
#include <string.h>
//定义一个tag为Books的结构体
struct Books {
char author[50];
char title[50];
int book_id ;
};
int main(void) {
struct Books book1;
struct Books book2;
struct Books *p_book1;
p_book1 =&book1;
strcpy(book1.title,"Android 进阶指南");
strcpy(book2.title,book1.title);
strcpy(p_book1->title,"C/C++ 进阶指南");
printf("book1 地址 = %p \n " , &book1);
printf("指针结构体 p_book1 地址 = %p \n " , p_book1);
printf("book2 地址 = %p \n " , &book2);
printf("指针结构体 p_book1 title = %s \n " , p_book1->title);
printf("book1 title = %s \n" , book1.title);
printf("book2 title = %s \n" , book2.title);
return 0;
}
输出:
book1 地址 = 0x7fffcfdf38d0
指针结构体 p_book1 地址 = 0x7fffcfdf38d0
book2 地址 = 0x7fffcfdf3860
指针结构体 p_book1 title = C/C++ 进阶指南
book1 title = C/C++ 进阶指南
book2 title = Android 进阶指南
复制代码
文件操作
打开文件操作
//filename文件名 , mode 模式
FILE *fopen( const char * filename, const char * mode );
复制代码
打开文件模式:
模式 | 描述 |
---|---|
r | 打开一个已有的文本文件,允许读取文件。 |
w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 |
a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。 |
r+ | 打开一个文本文件,允许读写文件。 |
w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |
关闭文件
int fclose( FILE *fp );
复制代码
写入文件
//参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。
int fputc( int c, FILE *fp );
//把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。
int fputs( const char *s, FILE *fp );
复制代码
读取文件
//读取单个字符
int fgetc( FILE * fp );
//读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。
char *fgets( char *buf, int n, FILE *fp );
复制代码
例子
#include <stdio.h>
int main()
{
FILE *fp = NULL;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
复制代码
#include <stdio.h>
int main()
{
FILE *fp = NULL;
char buff[255];
fp = fopen("/tmp/test.txt", "r");
fscanf(fp, "%s", buff);
printf("1: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff );
fclose(fp);
}
输出:
This
2: is testing for fprintf...
3: This is testing for fputs...
//首先,fscanf() 方法只读取了 This,因为它在后边遇到了一个空格。
//其次,调用 fgets() 读取剩余的部分,直到行尾。最后,调用 fgets() 完整地读取第二行。
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END