c指针——上课

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

预编译的输入是源程序(文本文件),输出依然是源程序(文本文件), 只不过作了一些替换而已.
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

指针是C编程语言中非常重要的概念之一,对于初学者来说可能会感到害怕和困惑。但只要理解了指针的原理和用法,就会发现它其实并不可怕。 首先,指针是一个存储变量地址变量,它可以指向任何数据类型的变量,包括整型、浮点型、字符型等等。我们可以通过指针访问变量的值,也可以通过指针修改变量的值,这是指针的一大优势。 其次,理解指针的应用场景能够帮助我们更好地使用它。比如,当我们需要在函数之间传递大量的数据时,通过传递指针可以提高程序的执行效率。另外,在动态内存分配和释放中,指针也是一个必不可少的工具。 理解指针的用法也是很重要的。首先,我们需要理解指针的声明和初始化。指针的声明使用“类型 * 变量名”的语法,例如 int *ptr; 表示声明了一个指向整型变量指针指针的初始化可以通过给指针赋值一个变量地址或者通过取地址符&获取变量地址。 然后,我们需要了解指针的运算。指针可以进行四种基本的运算:取地址运算符&,取值运算符*,指针加法和指针减法。取地址运算符&用于获取变量地址,取值运算符*用于获取指针所指向的变量的值。指针加法和指针减法用于指针地址的增加和减少,不同数据类型的指针相加或相减会有不同的结果。 最后,我们需要注意指针的安全性。在使用指针的过程中,需要特别小心避免空指针、野指针等问题的出现,因为这些问题容易引发程序的崩溃或者产生不可预知的结果。 总结来说,指针作为C语言中的重要概念,我们应该尽早学习和掌握。只要理解指针的原理和用法,我们就能够更加灵活地操作内存,提高程序的效率和功能。通过不断的实践和学习,我们可以逐渐摆脱对指针的恐惧,让指针成为我们编程的得力助手。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值