c指针——上课

本文详细介绍了C语言中的内存分配方式及如何使用地址和指针进行内存读写操作。主要内容包括宏定义、预编译指令、地址的概念、内存分配的形式、通过地址访问内存的方法、指针变量的定义和使用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预编译
程序从编辑到执行的过程:

预编译的输入是源程序(文本文件),输出依然是源程序(文本文件), 只不过作了一些替换而已.
1. #define 预编译指令
也称为宏定义. 在计算机技术中, 宏的意思是用一个字符序列替换另一个字符序列.
例:

以下是用字符序列3.14 替换字符序列 PAI

  1. #include 预编译指令

8地址、指针与内存的分配
以上引自于Kerniigan & Ritchie “ The C Programming Language” 第2版 第5章
★C程序中的内存分配有四种形式:①定义各种形式的变量;②定义数组;③动态内存分配;④字符串常量。
★在C程序中可以利用地址 对 当前有效分配给本程序的内存
进行读写操作;
(“当前”指:虽然过去有效分配了,但已释放了,即过期不行,
比如,某函数的自动变量,在函数调用结束后,就不应该对其进行
读写操作; “有效”指:内存被成功地分配给本程序,比如,不成功的动态内存分配)
★ 不能通过地址 对 通过字符串常量分配的内存 进行写操作;
★ C中的地址除了值之外,还有在 以这个地址值开始的内存区域中 所存对象的类型的信息,所谓C 中地址是“两位一体”。
★ C语言中有专门存放地址的变量,就是指针,或(指针变量)。

8.1 C语言中的地址
一谈到C语言中的地址,头脑中就应该反应到,地址有两个要点,或者说含有两个重要的信息,或者说地址是“两位一体”。
1) 地址值是多少?
2) 以该地址值为首地址的内存单元(们)所存的“东西”是什么类型?

比如:
int x; 给你的程序分配了4个字节的内存(整型变量,变量名为x),你可以通过变量名x来存或取整数(即通过变量名x来引用这个变量)。
假定为x分配的内存是以地址0x0012ff44开始的4个字节

在C中变量x的地址可由以下操作(运算)得出:&x
值为:0x0012ff44 (首字节地址值)
&x
是存int型数据的内存的地址,或内存中以这个地址值开头的若干(4)内存单元里所存东西的类型是int

通过运算 *(地址):可以对该地址所对应的内存区域进行某种类型(int)数据的读写操作。
比如:
*(&x)=6; //将整数6以“int 格式”写入以0x0012ff44为首地址的四个字节中,相当于x=6;
b=*(&x)+9; // 将以0x0012ff44为首地址的四个字节中的0,1读出,并将其作为“int 格式”的数// 据,相当于b=x+9;
printf(“%d”, *(&x)); 输出 6。
于是: *(&x)就等价于x
再比如:
float y; // 分配了4个字节的内存,浮点型变量,变量名为y
假定 y的地址为0x0012ff40

在C中变量y的地址可由以下操作(运算)得出:&y
值为:0x0012ff40 (首字节地址值)
&y
是存float型数据的内存的地址,或该地址值开始的内存单元上所存东西的类型是float型

运算 *(地址):可以对该地址所对应的内存区域进行某种类型(float)数据的读写操作。
比如:

*(&y)=3.14; //将3.14以“float 格式”写入以0x0012ff40为首地址的四个字节中,相当于y=3.14;
z=*(&y)/4.0; // 将以0x0012ff40为首地址的四个字节中的0,1读出,并将其作为“float格式”的//数据参与表达式的计算,相当于z=y/4.0;
printf(“%f”, *(&y)); 输出 3.140000。
*(&y)就等价于y

这有神马意思?后面讲 。“变量里的数据是活的(变化的),指针所指的变量是活的”

第二个侧面信息的作用:

*(&x)之所以能够将0x0012ff44 地址上的东西作为整型变量,都是因为&x中含有该地址所对应内存中所存数据的类型的信息
*(&y)之所以能够将0x0012ff40 地址上的东西作为浮点类型变量,都是因为&y中含有该地址所对应内存中所存数据的类型的信息

&x+1 也是一个地址,值为0x0012ff48,因为一个整型四个字节,此处自动地“以一当四”。
&y+1 也是一个地址,值为0x0012ff44,因为一个浮点型四个字节,此处自动地“以一当四”。
第二个侧面信息 “是存float型数据的内存的地址” 或“该地址开始的内存单元上所存东西的类型是float型” 程序中用以下符号 表达 float *
第二个侧面信息 “是存int型数据的内存的地址” 或“这个地址上所存东西的类型是整形” 程序中用以下符号表达 int *

8.2指针(指针变量)是存放地址的变量
1)指针变量的定义:
“是某类型的地址” 变量名;
比如
int * pi;
int a, *pa;
pa=&a;
*pa=4;
printf(“%d\n”,a);
则输出: 4

以上 pi, pa 都是变量,在内存中各占四个字节.(为什么?)

2)利用地址以及指针对内存进行读写操作
定义变量是分配内存的一种手段
例li0803 本例说明可用指针(指针变量)对内存进行相应类型数据的读或写。

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

include

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 今天给大家分享一个关于C#自定义字符串替换方法的实例,希望能对大家有所帮助。具体介绍如下: 之前我遇到了一个算法题,题目要求将一个字符串中的某些片段替换为指定的新字符串片段。例如,对于源字符串“abcdeabcdfbcdefg”,需要将其中的“cde”替换为“12345”,最终得到的结果字符串是“ab12345abcdfb12345fg”,即从“abcdeabcdfbcdefg”变为“ab12345abcdfb12345fg”。 经过分析,我发现不能直接使用C#自带的string.Replace方法来实现这个功能。于是,我决定自定义一个方法来完成这个任务。这个方法的参数包括:原始字符串originalString、需要被替换的字符串片段strToBeReplaced以及用于替换的新字符串片段newString。 在实现过程中,我首先遍历原始字符串,查找需要被替换的字符串片段strToBeReplaced出现的位置。找到后,就将其替换为新字符串片段newString。需要注意的是,在替换过程中,要确保替换操作不会影响后续的查找和替换,避免遗漏或重复替换的情况发生。 以下是实现代码的大概逻辑: 初始化一个空的字符串result,用于存储最终替换后的结果。 使用IndexOf方法在原始字符串中查找strToBeReplaced的位置。 如果找到了,就将originalString中从开头到strToBeReplaced出现位置之前的部分,以及newString拼接到result中,然后将originalString的查找范围更新为strToBeReplaced之后的部分。 如果没有找到,就直接将剩余的originalString拼接到result中。 重复上述步骤,直到originalStr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值