第一天笔记
-
数组作为函数参数,数组形参退化为一级指针
#include<iostream> using namespace std; //这里的[]其实没有什么意义,里面写或不写都是没问题的。因为函数传入进去的是指向数组的首地址的指针 void print_arr( int a[], int len)//也可以写int* a { cout<<"数组作为函数形参后退化为指针所占内存大小:"<< sizeof(a) <<endl; for( int i = 0; i < len; i++) { cout<<a[i]<<" "; } cout<<endl; } int main() { int a[5] = {1, 2, 3, 4, 5}; cout<<"数组所占内存大小: "<< sizeof(a) <<endl; int n = sizeof(a)/sizeof(a[1]); cout<<"数组长度: "<< n <<endl; print_arr(a, n); return 0; }
-
为数据类型起别名
#include <iostream> using namespace std; //为类型取别名 typedef unsigned int u32; //typedef 一般与结构体一起用 typedef struct stu { int number; int age; char name; }mystruct; int main() { u32 a; mystruct jack; return 0; }
-
void , 无类型
-
函数参数为空,定义函数时,可以用
void
修饰,int fun(void)
-
函数没有返回值,必须用
void
修饰,void fun(int a)
-
不能用
void
定义普通变量,void a; //error
, 因为无法确定类型,不同类型分配空间不一样 -
可以定义
void*
变量:void *p; //万能指针
,指针变量内存确定, -
数据类型的本质,固定内存块大小别名
int b[10];//b和&b不一样。 b: 首元素地址,+1 = +4字节; &b 整个数组首地址 +1 = +40字节
-
-
变量:本质是内存空间的别名
必须通过数据类型定义变量。
变量的三要素:名称、大小和作用域。还需要考虑变量的生命周期 -
内存四区
-
全局区,存放全局变量,静态变量和字符串常量。子函数中的静态局部变量,作用域是子函数,但是生命周期是整个程序。整个程序运行完毕系统自动回收
char* p = "abdsf";//字符串常量,存在全局区,程序结束后由操作系统释放
-
栈区
系统分配空间,系统自动回收,函数内部定义的变量,函数参数,函数结束,其内部变量生命周期结束
地址生长方向:由上往下递减 -
堆区
程序员动态分配空间,由程序员手动释放,没有手动释放,分配空间一直可用。
地址生长方向:有下往上递增 -
代码区
-