这篇博客主要总结C语言学习中容易出错,理解不到位的一些知识点——学习过程中总结,长期更新。
1.指针定义
int* p; 等价于 int p;
int* p=&a; 等价于 int p; p=&a; 指针p指向变量a的地址。
2.数组指针
1.数组名可以作为数组首地址使用
2.对与数组a[10], a+i 等价于 &a[i]
3.a[i] 等价于 *(a+i)
3.指针变量作为参数,对指定地址赋值会改变原数据的值
4.结构体里不能定义本身但是可以定义自身类型的指针
5.结构体指针变量内元素的访问方式
p为结构体指针变量
(*p).id 等价于 p->id
(普通结构体变量可以直接使用 . 进行访问)
6.结构体数组初始化
#include <stdio.h>
struct test {
int id;
char name;
char sex;
//不初始化就定义结构体变量
test() {}
//只初始化id
test(int _id) {
id = _id;
}
//同时初始化id 和 name
test(int _id, char _name, char _sex) {
id = _id;
name = _name;
sex = _sex;
}
//也可以简化书写(只初始化name 和 sex)
test(char _sex, char _name) : sex(_sex), name(_name) {}
} person1, person2, person3;
int main() {
person1 = test(1);
printf("id: %d \n", person1.id);
person2 = test('F', 'A');
printf("name: %c sex: %c\n", person2.name, person2.sex);
person3 = test(3, 'B', 'M');
printf("id: %d name: %c sex: %c\n", person3.id, person3.name, person3.sex);
return 0;
}
7.使用cin cout 输入输出
//引入头文件
#include "iostream"
using namespace std;
int a;
cin >>a;
cout <<a;
endl 用来换行
8.C++控制double型输出精度
引入 #include “iomanip”
double a;
cin >> a;
//两位精度
cout << setiosflags(ios::fixed) << setprecision(2) << a << endl;
return 0;
9.读取文件
1.while…EOF型
EOF——End Of Line 值为-1 <crtl+z>可以触发 EOF状态
while(scanf("%d",&n) != EOF){
…
}
若要读取字符串
while(scanf("%s",str) != EOF){
…
}
或者使用get()函数
while(get(str) != NULL){
…
}
2.已知输入数据量采用
while(T–){
scanf("%d",&a);
…}
10.输入/输出字符串
1.gets() puts() 可以读取空格
gets()
换行符\n作为结束
puts()
输出一行字符串
自动加一个换行
#include <stdio.h>
int main() {
char str[100];
while (gets(str)) {
puts(str);
}
}
2.scanf("%s",str)/scanf("%c",str)
%s不能读取空格 换行符\n作为结束 %c可以读取空格
scanf 使用%c时会将换行符 \n 读入,需要用getchar吸收空格
#include <stdio.h>
int main() {
char str[100];
while (scanf("%s", str)) {
//%s 不能读取空格
printf("%s", str);
}
}
%c前没空格,scanf将读取标准输入流中的第一个字符,%c前有空格,scanf则读取标准输入流中第一个非空白字符。
#include <stdio.h>
int main() {
char a, b;
scanf("%c", &a);//%c前无空格
printf("%d",a);
scanf(" %c", &b);//%c前有空格
printf("%d",b);
}
测试结果:
3.getchar() putchar()
读取输出(结尾不自动加换行)单个字符
回车作为结束
scanf 使用%c时会将换行符 \n 读入,需要用getchar吸收空格
#include <stdio.h>
int main() {
char key;
key = getchar();
putchar(key);
}
11.数据类型范围
int: [-231,2^31-1]
12.输出格式
int -->%d
long long int -->%lld
13.四舍五入(避免浮点数运算)
通过判断余数的值决定是否需要四舍五入
#include <stdio.h>
int main() {
int a = 12345, b = 45678;
//以b-a除100为例
int ans = b - a;
if (ans % 100 >= 50) {
//需要四舍五入
printf("需要四舍五入 %d", ans / 100 + 1);
} else//不需要四舍五入
printf("不需要四舍五入 %d", ans / 100);
return 0;
}
还可以使用math.h头文件中的round函数,但是要涉及到浮点数运算
#include <stdio.h>
#include "math.h"
int main() {
int a = 12345, b = 45678;
//以b-a除100为例
int ans = b - a;
printf(" %f", round(ans / 100));
return 0;
}
14.二维数组存放字符串
char str[3][4] = {"ab", "a", "MON"};
printf("%s", str[2]);
注意第二位数值大小为存放的字符串最大长度+1。
每一维存放一行字符串。