1、如何访问一个空间?
有名访问
无名访问
指针的大小跟你的编译器是x64系统还是x86系统有关,
备注:%p,打印地址(十六进制)
C语言如何用地址来描述一个空间?
C语言如何识别变量的属性?
- 定位,先右看,再左看
数组:有多少个?每一个怎么存的?
高级变形第二个:
- 定位---a5【一个指针,地址,门牌号】
- 怎么访问?一个到另一个多少字节、空间??
- 右看----【说明访问空间的方式是数组,5个5个访问】
- 左看----以int方式访问
- a5相当于钥匙,5个int5个int的方式访问。
第三个类似,4个4个地访问,只不过是明确告诉你有3串。
char (*a[5])[4];
a--右看--升级为数组【a大箱子中放了5个小箱子,每个小箱子里存了一把钥匙】--怎么访问??---把()作为整体,四个char四个char地访问。
2、函数地址保存
函数是空间
-函数名就是这个空间地址的常量值的代号
如何用一个变量保存这个代号?
-保存这个代号,地址
-案例:printf更换名
int fun(){
xxx
}
int main(){
xxx=abc;
xxx();
}
//案例:printf换名
#include<stdio.h>
int xxx(void)//假设这个是printf()的函数【在头文件中找到printf的函数声明】
int main(){
int (*myshow)(const char *__format,...);//从头文件中找到的。
myshow=printf;
myshow('hello world!\n');
return 0;
}
//模拟计划执行表
#include<stdio.h>
void do_game() {
printf("play game!\n");
}
void do_book() {
printf("read books!\n");
}
void do_music() {
printf("listen music!\n");
}
int main() {
int i;
//定义一个数组空间,保存了key,每把钥匙是的函数行为;
void(*event[3])(void);
//设置每天做的事
event[0] = do_game;
event[1] = do_book;
event[2] = do_music;
//[相当于实现了上串代码的------函数改名]
//循环执行每天做的事情
for (i = 0; i < 3; i++) {
event[i]();
}
return 0;
}
3、空间的属性3.7
空间可以任意访问吗?
-例子:为什么?char s[]="xxx";输出%s能够实现,而char *s="xxx";输出%s就不能实现??
- (*s存的是字符串,s[0]在这3是只读属性)
操作系统会提供一个虚拟地址【不用考虑物理问题】
第二个相当于存了一把钥匙,code段【定义的函数,写的代码放这里面】,只读
第二段分配了一个空间。
3.8-static段的特点分析
相当于放到了全局区,date段
int fun(){
static int a=0;//初始化,只一次[可用于统计函数运行的次数]
static int a;//定义
static int a;//赋值
a=10;
}
3.9空间权限之边界访问
要考虑那些问题?
- 读写权限
- 边界标志
- 1)无越界检查【容易改掉别的值】 即使const int a=1234;也限制不了被越界访问。 【但是,c++可以不被改掉】 注意考虑定义在哪?定义多少个有效空间?【需要考虑】
- 2)如何定义边界?-数量-特殊标志-字符串(c编译器认可)
3.10特殊空间行为
1、字符空间
-字符串
有默认的结束标志:数字0,即'\0'
备注:记得用sizeof(s)/sizeof(s[0])来计算字符串数组的长度,计入‘/0’。
-字符串数组的初始化行为
-字符空间的遍历写法
//模板 ----------------------- int char *t; int i=0 int main{ t=s1; //遍历字符串空间 while(t[i]){ //每个元素的处理方法,例如统计字符串中a出现的次数 cnt++; i++ } //其他处理 return 0; } ------------------------