零散的C笔记
▲▼●◆■★
①②③④⑤⑥⑦
如何表达数组类型
如何表达函数指针
c++编译器如何管理两函数之间变量的关系?
如果定义了一个.cpp,然后再改为.c可能会出现问题,找不到main函数
指针变量和它所指向的内存空间变量是两个不同的概念
指针指向谁,就把谁的地址赋给指针变量
内存四区概念:
主调函数(main等)调用被调函数
1.main函数分配的内存都可以在被调函数里使用
2.如果在被调函数里面的临时区(栈)分配内存,主调函数是不能使用的(回忆形参实参交换数据)
★
c可以在栈区(临时区)分配内存,但用完后直接被编译器回收
主函数调用被调函数,被调函数的返回值先进栈,然后参数,最后运行
函数调用模型<————>函数内存(四区)模型
形参也是被调用该函数的参数,只不过具有对外的属性
★
*p放在等号左边是去修改内存空间的值(写)
*p放在等号右边是从内存空间里取值(读)
*就像一把钥匙,通过一个地址,去打开一扇门,去修改门后面的内存空间
多重指针:
对参数的指针类型应该怎么理解
理解角度需要从两个角度出发
站在c/c++编译器的角度 对形参。如果是指针类型,c编译器只会分配四个自己的内存
指针数据类型到底是什么
指针的数据类型实在它所指向的内存空间的数据类型
指针的数据类型具有依附特性(char、int、double……)
有关字面量的理解:
常量不能取地址吗?
int* a=&10;//10是字面量 不能取地址,没有放在堆栈、全局区,可以按照放在代码区之类的区域内理解它
寄存器内的东西不能取地址
堆栈的生长方向:
栈的开口向下,不断压栈内存地址越来越小
堆相反
int a=10;
int* p=NULL;
p=&a;
//p是谁的地址,*p就去间接的修改谁的值
*p=20;
引:p是实参的地址呢?
向NULL空间写数据 读数据;
char* p=NULL;
*p=100;
向自己不知道的内存空间写数据
char *p=0x77;
*p=100;
指针是为内存服务的,没有内存哪来的指针;
不从内存四区的角度看,讲指针等于白讲
memcpy()
s指向常量字符串,这部分内存空间是不可修改的。
s[]后,s指向的空间是栈空间,是可以修改的。
在C中没有字符串这种类型,是通过字符数组(char buf[100])去模拟的
字符串和字符数组的区别是不是带有\0 ?
const int a=10;
int const b=10;
const char* c;
char* const d; //常量指针 d++;(error:常量指针不能++)
const char* const e;
http://blog.csdn.net/melody_fhm/article/details/6683504
//指针常量
//常量指针
数组做函数参数会退化为指针
char* buf[]={"while","case","static","do",0}
C语言NULL的宏定义是0
#define NULL 0
★不免野指针的方法:
1.初始化时定义指针变量,指针变量赋值成NULL
2.释放时,判断是否为NULL,不是NULL则free()
3.释放完毕以后再赋值成NULL
数组和指针做函数参数的等价关系:
char buf[10]==>char* void func(int a[10])==>void func(int a[])==>void func(int* a)
char* buf[10]==>char** buf
char a[5][10]==>char(*buf)[10] void func(int a[5][10])==>void func(int a[][10])==>void func(int (*a)[3])
出现上图提示信息原因:
1.malloc的某个地方越界
2.拷贝数据或分配内存不对