共用体
共用体union,只能存储一种数据(在某个特定的时候),因此它的长度为最大成员的长度。当数据使用多种格式但不会同时使用时,可以节省空间。
指针
指针是一个变量,存储的是值的地址,而不是值本身,所以可以修改它的值。
指针+1增加量等于它它指向的类型的字节数。eg,double* ptr = &a; ptr = ptr + 1;
在数值上增加8。
如果数据类型本身不是指针,则可以将const 数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给const指针。
当且仅当只有一层间接关系(如指针指向基本数据类型时),才可以将非const地址或指针赋给const指针。
函数指针
函数也有地址,其地址是存储其机器语言代码的内存的开始地址。
function A(){}的函数地址就是函数名A
比如:
函数原型:double A(int b);
正确的指针类型声明如下:
double (*pf)(int);
(pf)是函数,pf是函数指针//注意,*pf一定要加括号,因为后面的括号优先级比高。
内联函数
编译器将使用相同的函数代码替换函数调用。
编译器不一定会满足程序员内联函数的需求,可能认为函数过大或者函数调用了自己(内联函数不能递归,也最好不要有循环和switch等结构)。
extern C关键字
在C++文件中引用C的头文件时,需要加extern “C”关键字
cpp文件
#include <iostream>
#include "cExample.h"
//没有加extern "C"
int main(int argc, char* argv[]) {
add(2, 3);
return 0;
}
结果出现了:
所以正确的做法应该是:
extern "C" {
#include "cExample.h"
}
int main(int argc, char* argv[]) {
add(2, 3);
return 0;
}
例如int add(int a, int b)函数经过C++编译器生成.o文件后,add会变成形如add_int_int之类的, 而C的话则会是形如_add, 就是说:相同的函数,在C和C++中,编译后生成的符号不同。
这就导致一个问题:如果C++中使用C语言实现的函数,在编译链接的时候,会出错,提示找不到对应的符号。此时extern “C”就起作用了:告诉链接器去寻找_add这类的C语言符号,而不是经过C++修饰的符号。
引用自hokein‘s github