24.4.5C语言学习笔记|访问空间地址【之前一直迷惑的问题】

1、如何访问一个空间?

有名访问

无名访问

指针的大小跟你的编译器是x64系统还是x86系统有关,

备注:%p,打印地址(十六进制)

C语言如何用地址来描述一个空间?

C语言如何识别变量的属性?

  • 定位,先右看,再左看

数组:有多少个?每一个怎么存的?

高级变形第二个:

  1. 定位---a5【一个指针,地址,门牌号】
  2. 怎么访问?一个到另一个多少字节、空间??
  3. 右看----【说明访问空间的方式是数组,5个5个访问】
  4. 左看----以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;
}
------------------------

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值