C语言中一些易混淆忽视的知识点

C语言中一些易混淆忽视的知识点

一、使用 VS2013 作为编译环境时需要注意的几点问题

  1. 在 VS2013 中使用 scanf 输出函数时,编译会报错,提示我们使用scanf_s等相应的函数,虽然这种方法更有利于程序的安全,但很多时候很不方便,不利于代码的移植。
    我们可以采取更好的方法:
    1)添加预处理#pragma warning(disable:4996)忽视该警告
    2)添加预处理#define _CRT_SECURE_NO_WARNINGS

  2. 一般情况使用 VS2013 编译运行C语言代码时,可执行窗口会闪退从而看不见结果,如果不想让其消失,需程序中添加:system("pause");
    system()就是调用(DOS)系统命令(和shell命令);
    pause ,即DOS命令集合中的暂停命令;
    注意:使用该语句需调用头文件#include<windows.h>

//Eg1:
#include<windows.h>
#include<stdio.h>
#pragma warning(disable:4996)

int main()
{
    
    
	int a = 0;
	printf("请输入执行操作:1、hello world 2、exit\n");
	scanf("%d", &a);
	if (a == 1)
		printf("hello world!\n");
	else
		exit;
	system("pause");
	return 0;
}

二、字符与字符串

  1. C语言的字符数据类型(char)占一个字节,其本质是整型;

  2. C语言存在字符串,但没有字符串类型!
    即不能直接定义字符串变量:string str = ''abcd'';//错误!
    C语言间接定义字符串:通过数组char str[] = ''abcd'';char *str = ''abcd'';指针保存;

  3. 字符串的大小(带’\0’)与长度(不带’\0’)是两个不同的概念;
    通过 sizeof(按位求长度操作符)可以求出字符串大小:sizeof(str);
    通过 strlen 函数(该函数识别到’\0’停止计数)可以求出字符串长度;

  4. 所有从终端输入或从终端显示的内容都是字符;即当需要输入数字1234时,用户从键盘输入的是字符 1 2 3 4,通过 scanf 函数格式转换,printf 亦然。

三、函数、数组、关键字、操作符

  1. C语言的函数默认返回值是整型(int);
  2. 临时变量不初始化默认值为随机值;
  3. 数组可以整体被初始化,但是不能被整体赋值;
  4. define 宏替换,利于代码的可维护(注:define 不是关键字,它是编译器的预处理实现)
    #define MAX 100 用MAX替换100
    #define ADD(x,y) ((x)+(y)) 用ADD(2,3)替换2+3(替换过程不进行计算)
  5. 关键字:const 使变量不能直接被修改;
  6. 关键字:extern 用来对变量或函数的声明 (声明可以多次)
    extern int g_val;声明变量
    extern void test();声明函数
  7. 关键字:static
    修饰局部变量:使该变量生命周期变为全局,但作用域不变;
    修饰全局变量:使全局变量只能在本文件使用,不影响生命周期;
    修饰函数:使该函数只在本文件有效;
  8. 操作符 sizeof :按位求长度操作符;
  9. 三目操作符 :exp1 ? exp2 : exp3;

四、指针

  1. 定义一个指针本质是定义一个指针变量,用来存放地址;
  2. C语言指针的存在提高了数据查找效率;
  3. 对指针类型的对比认识:
//整型
int a = 10; //整型变量放整型
a = 20;     //变量在左,左值使用变量的空间属性
int b = a;  //变量在右,右值使用变量的内容属性
//类比指针
int *p = &a;//指针变量放指针
p = &b;     //左值使用变量的空间属性
int *q = p; //右值使用变量的内容属性
  1. 指针的解引用(*p)代表指针所指向的目标;
  2. 指针变量的大小与指向的内容等等无关,
    在32位系统中指针大小位4个字节,
    在64位系统中指针大小位8个字节;

五、结构体

  1. 定义结构体本质上是定义一种类型(而不是变量),属于自定义类型;
  2. 要注意,结构体不能为空,即花括号内必须有内容;
  3. 初始化结构体:
//Eg1:
struct Stu           //通过struct自定义了一种新的类型Stu,Stu是类型名
{
    
    
	char name[20];
	int age;
};
struct Stu S = {
    
    '''', 20};  //初始化

//Eg2:
struct Stu                //定义了A B C三个Stu类型的变量,int A,B,C;
{
    
                             //这样定义的结构体变量一般是全局变量                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
	char name[20];
	int age;
}A,B,C;

//Eg3:
typedef struct Stu  //通过typedef将自定义结构体类型名struct Stu 替换为S_t
{
    
    
	char name[20];
	int age;
}S_t;
S_t S = {
    
    '''', 20};  //初始化
  1. 若结构体可以定义类型,那么该类型就可定义结构体指针变量;
  2. 结构体的使用
//输出一个结构体的内容:
S_t tom = {
    
    ''汤姆'', 20};
printf("name: %s\n", tom.name);
printf("age: %d\n", tom.age);

//若定义了一个结构体指针,使用方法如下:
struct student *p = &tom;
printf("name: %s\n", p->name);
printf("name: %s\n", (*p).name);//和上面的等价

Guess you like

Origin blog.csdn.net/Sober_harmonic/article/details/116809898