c/c++中一些基础但必须熟记的知识

2019-07-3114:15:21编程语言入门到精通Comments2,099 views字数 2734阅读模式
c/c++中一些基础但必须熟记的知识

c/c++中一些基础但必须熟记的知识文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

(1)const 与#define文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

const在C++中包含了更丰富的含义,而在C语言中仅意味着:“只能读的普通变量,”或“不能改变的变量”,故在编译阶段需要的常数仍然只能以#DEFIEN宏定义!故在C语言中如下程序时非法的:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

const int SIZE = 10;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

char a[SIZE];错误:SIZE不是常数!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

c/c++中一些基础但必须熟记的知识

(2)static变量初始化的问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

看下面代码:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

#include<stdio.h>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

int main(void){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

int i = 0;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

for(i=0; i<5; i++){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

static int a = 10;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

printf("static a is [%d]\n",a);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

a++;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

return 0;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

该代码打印出如下内容:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

static a is 10文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

static a is 11文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

static a is 12文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

static a is 13文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

static a is 14文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

该代码说明变量在定义为static变量后,初始化只进行一次。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

(3)externC问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

1.被extern “C”限定的函数或变量是extern类型的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

2.被extern “C”修饰的函数或变量是按照C语言编译和链接的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

C++和C在编译时的区别:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

C++支持函数重载,而C不支持文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

例如:函数 viod foo(int x, int y);在C++中编译后在符号库中的名字是_foo_int_int,而C编译后生成的名字是_foo.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

一句话概括extern “C”的目的:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

实现C++和C及其他语言的混合编程。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

具体用法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

1.在C++中引用C语言中的函数和变量,在包含C语言头文件是,需进行下列处理:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

extern "C"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

#include "cExample.h"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

2.在C中引用C++语言中的函数和变量,C++头文件中需添加extern “C”,而在C语言中不能直接引用声明了extern “C”的头文件,而应该仅将C文件中在C++中定义的extern “C”函数声明为extern类型文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

C++头文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

#ifndef CPP_EXAMPLE_H文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

#define CPP_EXAMPLE_H文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

extern "C" int add(int x, int y);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

#endif文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

C++实现文件cpp_Example.cpp文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

#include "cppExample.h"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

int add(int x, int y)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

return x + y;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

C 实现函数Cfile.c文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

extern int add(int x, int y)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

int main(int argc, char* argv[])文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

add(2, 3);return 0;;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

(4)什么是宏定义

1.宏定义“像”函数;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

2.宏定义不是函数,因而需要括上所有参数;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

3.宏定义可能产生副作用;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

#define MIN(a,b) ((a) < (b) ? (a) : (b))文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

(5)void和void 指针深层探讨

规则:在C语言中,凡是不加返回值类型限定的函数,就会被编译器作为返回整形值处理,但很多程序员却误认为其为void类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

1.任何类型的指针都可以直接赋值给void*类型的指针,无需进行强制类型转换。但是void*指针却不可以不进行强制类型转换而直接就赋值给其他类型的指针。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

2.如果函数没有返回值,应声明为void类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

3.如果函数无参数,那么应声明其参数为void类型。在C语言中可以给无参数的函数传送任意类型的参数,但是在C++中不能向无参数的函数传送任何参数,错误提示:function does not take 1 parameters.所以无论是C还是C++,若函数不接受任何参数,应将其声明为void类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

4按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,这是因为ANSI标准认定:进行算法操作的指针必须是确定知道其指向类型大小的。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

int *ptr;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

ptr++;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

ptr++的结果是使其增大sizeof(int).文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

但是GNU则不这么认定,它指定void*的算法操作和char*一致。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

5.如果函数的参数可以是任意类型指针,那么应将其声明为void*类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

典型的如内存操作函数:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

void * memcpy(void *dest, const void *src, size_t len);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

void * memset(void *buffer, int c,size_t num);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

这样,任何类型的指针都可以传入memcpy和memset中,这也真实的体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而无论这片内存是什么类型!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

6.void不能代表一个真实的变量文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

如void a;错误文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

(6)内存分配方式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

内存分配方式有3中:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

1. 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

2.在栈上创建,在执行函数时,函数内部的局部变量的存储单元都是可以在栈上创建的。函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

3。在堆上分配,亦称动态内存分配,程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存,动态内存的生存期由我们决定,使用灵活,但是容易出错。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

(7)内存操作注意事项

1.用malloc或new申请内存之后,应该立即检查指针值是否为NULL,防止使用指针值为NULL的内存。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

2.不要忘记为数组和动态内存赋初值,防止将未被初始化的内存作为右值使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

3。避免数组或指针的下标越界,特别要当心发生多1或者少1的操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

4.动态内存的申请和释放必须配对,防止内存泄露。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

5.用free或delete释放了内存之后,立即将指针设置为NULL,防止产生"野指针".文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

"野指针"不是NULL指针,是指向”垃圾“内存的指针。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

(8)如何判断大小端格式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

编写一个C函数,若处理器是big_endian的,则返回0,若是little_endian的,则返回1;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

int checkCPU(void){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

union w{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

int a;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

char b;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

}c;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

c.a = 0x1234;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

return(c.b == 0x34);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

同样的功能:linux操作系统中的相关源代码是这么做的:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

static union{char c[4];unsigned long I;}enddian_test = {{'l','?','?','b'}};文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

#define ENDIANNESS ((char)endian_test.I)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

如果ENDIANNESS = l,则为小端格式,反之;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

总结:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

在C C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时,我们也可以使用联合体来发挥长处!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14801.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/14801.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定