C C++

C/C++基础语法知识

C/C++基础语法知识

作者: yym439 时间: 2020-12-31

一、C/C++ static关键字

  1. 局部静态变量
    • 只初始化一次 —– 具有‘记忆性’
    • static具有全局唯一性,每次调用时, 都指向同一块内存(注意线程不安全) —– 作用域相同,提高‘生存期’
  2. 全局静态变量/函数:
    • 对于全局变量, 不论是否有static限制, 它的存储区域都是在静态存储区, static起到修饰作用域
    • static变量/函数的作用域仅局限于本文件(内部函数)
  3. 静态数据成员/成员函数(C++特有)
    • 属于一个类而不是属于此类的任何特定对象的变量和函数(不用声明类对象可以直接调用)
  4. 博客

二、C/C++ extren关键字

  • 可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义。
  • 博客

三、C/C++指针

  • 指针就是内存地址
  • 指针本身可以运算(改变内存地址)*(a++)
  • 指针所指的值可以运算(加减内存地址值的内容)(*a)++

  • 函数指针: 返回值类型 (*指针变量名)([形参列表]);
    • int func(int x); //声明一个函数
    • int (*f)(int x); //声明函数指针
    • f = func; //func函数的首地址赋值给指针f
  • C++引用变量:
    • 类似于指针常量: int* const ptr = &a;
    • 必须在申明引用变量的时候初始化: int &b = a;
    • C语言只能传递值
int *a;
a = (int*)malloc(sizeof(int));
*a = 1;
printf("add of a:%p,%p,%d\n",&a,a,*a);
&a:变量a本身所在的地址
a:变量a存放的内存地址(1的内存地址)
*a:变量a存放的内存地址的值 1

四、C函数返回值

  • 函数可以返回局部变量的值,不能返回局部变量的地址;局部变量地址存放在栈中,函数返回,局部变量的内存也被清空了

  • 函数可以返回指向堆内存的指针(malloc自己申请的内存都存放在堆中)

  • 函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型

  • 数组是不能作为函数的返回值;但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的

char p[]="hello world"; //p不能用作函数返回
char *p="hello world"; //p可以用作函数返回

1. "hello world"是一个字符串常量,存放在静态数据区
2. char p[]="hello world";这条语句让"hello world"在内存中有两份拷贝,一份在动态分布的栈中,一份在静态存储区,当函数退出时,局部变量p的内存是要被清空的。
3. char *p="hello world";变量p是指向静态存储区的指针,此变量指向的内存在程序运行过程中不会被清空。

linux C 调试器

  • gdb test(可执行程序)
设置断点:b
运行程序:r
单步执行:n
跳入函数:s
跳出函数:finish
打印内容:p

查看设置的断点:break list
查看源码:l

.h和.cpp头文件引用原则

  • 如果可以不包含头文件,那就不要包含,这时候前置声明可以解决问题,如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了,因为指针这一数据类型的大小是特定的,编译器可以获知
  • 尽量在CPP文件中包含头文件,而不要在头文件中包含。假设类A的一个成员是一个指向类B的指针,在类A的头文件中使用了类B的前置声明,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非声明部分(H文件)