admin 管理员组文章数量: 1184232
2024年4月22日发(作者:用分数的数组词)
维普资讯
・76・(总702) 关于指针数组与指向指针的指针教学研究 2007正
关于指针数组与指向指针的指针教学研究
鄂州大学 吴 琼 陈新文
指针是C语言中的一个重要的概
图2所示。
念,也是C语言的一个重要特色,正确而
变量名称:
单元地址:
图2指向指针的指针P
时,并未定义行的长度,只是分别在内存
. .,
中存储了长度不同的字符串,然后角指针
数组中的元素分别指向它们,在内存中没
有浪费存储单元。所以用指针数组处理字
符串可以节省内存空间。
使用指针数组处理字符串还可以提
符的字母顺序排序,利用指针数组,就不
灵活地运用它可以使程序简洁、紧凑、高
效,这对软件设计十分必要。但是指针概
念比较复杂,应用也比较灵活且容易出
错,学习者较难掌握,是c语言教学的难
内存单元:…l 3 6 I 9 1.. (.)()o 1... J
P所指单元值为2000,它是一个指向
点,特别是指针与数组结合使学习者理解
另一个内存单元的地址,地址是2000的
高运算效率,如果想对这些书名按书名字
起来更加困难,本文从概念表示到应用分
单元值为整形数据3。
析由浅入深地讨论了指针数组与指向指
针的指针。阐述了学习方法与教学经验。
l基本概念辨析
如果在程序中定义了一个变量,在编
译时系统就给这个变量分配内存单元。例
如:int i一3,j一6,k一9;(如图1所示)
变量名称: i
内存单元:…I 3 I 6 I 9}1.. .
单元地址:2000 2002 2004 2006
图1 变量 、 在内存中存储
变量名是指数据对象的名称。例如i、
j、k等为整形数据变量名。
变量值是指数据对象的值。例3、6、9
即为i、j、k的值。
指针即数据对象的内存地址。例如地
址为2002的单元中存放的是变量j的值
6。
指针变量是一种专门存放数据对象
的内存地址的变量。
数组是指具有相同数据类型的有序
数据的集合,一个数组,其元素均为指针
类型数据(即内存地址数据),称为指针数
组,也就是说,指针数组中的每一个元素
都相当于一个指针变量(指向地址变量)。
如果一个指针变量指向的内存单元
里所存的数据值是指针类型数据(内存地
址),称该变量为指向指针数据的指针变
量,简称为指向指针的指针。
2指针数组与指向指针的指针定
义与表示
一
维指针数组的定义形式为:类型名
*数组名[数组长度]。例如:int*P[4];
表示数组声有4个元素,每个数组元素都
是一个指针变量(指向内存地址),每个指
针变量所指内存单元都存放一个整形数
据。
定义一个指向指针数据的指针变量,
例如:int**P;相当于int*(*声);表示
指针变量户是指向一个整形指针变量。如
3指针数组应用举例及算法分析
假设图书馆有若干本书,将这些书名
2 2 2
字符存储在一个数组中,可以用二维数组
O 6 2
来定义:char name_5“ ]一{‘.Fol
∞
low me”,
∞
“BASIC”.“Great Wall”,“FORTRAN”,
“
computer design”};其存储如图3所示
(假设数组的首地址为1000):
F 0 l l 0 W
\C
B A S l C \0
G t W
l l \0
F 0 R T R A N \0
C 0 O t
d g \0
图3字符串用二维数组
定义后的存储
如果有一个字符串比较长,则要求数
组列数必须按最长的字符串长度来定义
(如图3所示),即使某些字符串长度不足
16,也要占16B。这就会浪费许多内存中
元。
也可以用指针数组来定义:char*
name[ ]一{‘‘Follow me”,“BASIC”,“Great
Wall”, “F0RTRAN”. “computer
design”};其存储如图4所示(假设数组的
首地址为1000):
nameEo3
10OO ÷ F O l l O
\0
nameE1]
1010 L - g A S l C \0
nameE23
1016 L+ G t
W l l \0
nameE33
1O27卜+ F 0 R T R A
N \o
nameE43
1035 L - C O O t
d
l g \0
图6字符串用指针数定
义后的存储
从图3和图4可以看出,用二维数组
时每行的长度是相同的,而用指针数组
必改动字符串的位置:只要改动指针数组
中各元素的指向,并且各字符串的长度可
2 1
以不同,而且移动指针变量的值要比移动
字符串所花的时间少得多。
8
∞
4
例如:将以上5个书名从小到大排序
后输出,程序如下:
main()
{void sort(char*nameE ̄,int n);
void print(char*nameE ̄,int n);
char*name[5]一{‘‘Follow me”,
“BASIC”,“Great Wall”,“F0RTRAN”,
“
computer design”、
int n一5;
sort(name,n);
print(name,n);)
void sort(char*name口,int n)/*
字符串排序函数*/
{char*temp;
int i,j,k;
for(i一0;i<一n一1;i++)
{k—i;
for(j—i+1;j<n;j++)if
(strcmp(nameEk],nameEj ̄)>O)k—j;
if(k!一i){temp—name[i];
name[i]一nameEk ̄;nameEk]一temp;}
}}
void print(char
字符串输出函数*/
{int i;
for(i一0;i<n;i++)printt(“
s n”
,nameEi]);)
程序运行后指针数组的情况如图5
所示:
可以看到字符串本身并未改变存储
位置,而是改变指针数组中各元素的指向
(它们存放字符串的起始地址)。显然,交
换地址值要比交换字符串中字符所花费
的时问要少,尤其是当字符串比较长时更
为明显。相反,如果交换字符串本身,不仅
(下转第79页)
维普资讯
第2O卷第9期
为
r户
电脑开发与应用 (总705)・79・
nameEo], P是nameEo]的值1000,即第
一
(上接第76页)
name}0
i000 l, F 0 1 1 0
\O
1ameLo]
i000 l, F 0 1 1 0
\O
个字符串的起始地址,用printf函数输
出第一个字符串(格式符为 S)。依次输
出5个字符串,运行结果与程序改写前运
行的结果完全相同。可以看出使用指针变
namef i f
i010【 _ g A S i C \O
name[2
1016 7 G r
name[-3]
1027
name[4]
t
name[1]
i010i/j g A S 1 C
6 7 G t
name[2J
101
name ̄3J
1027『\ F O R T R
N \O
K W a l 1 \O
F 0 R T R A
1035々 C 0
K W l 1 \O
量,可使程序更加简洁、紧凑,而且运行效
率得到提高,不过学习过程比较难理解,
容易产生混乱。
\ N \O
e
0 t
name[4]
1035 l C 0 m 0
f
d
g \O
d I e
g \0
5 结束语
指针是C语言的最显著的特征,也是
图5字符串用指针数定
义后的存储
图6字符串用指针数定
义后的存储
main()
C语言中的重点难点内容,尤其是指针和
数组常常是紧密联系的,使用熟练的话,
灵活。本文从内存地址、指针、数组等基本
概念辨析入手,介绍了指针数组与指向指
针的指针的定义与表示,重点对指针数组
和指向指针的指针的应用进行比较分析,
希望对该节内容的教与学有所参考和帮
助。
要按最长的字符串长度设置二维字符数
组,浪费大量的内存空间,而且,在内存中
大量移动字符,时间较长,效率低下。
{char*name[5]一{‘‘Follow me”,
可以使程序质量提高,且编写程序方便、
“BASIC”,“Great Wall”,“FORTRAN”.
“
4指向指针的指针应用与分析
从图4可以看到name是一个数组,
它的每一个元素是一个指针类型数据,其
computer design”)
char* P;
int i;
值为内存地址,数组名name代表指针数
指向指针数组元素:char* P;P—name;
如图6所示。可将上面的排序程序改写
for(i=0d<5;i++){P—name+i;
ntf(“%s\n”, P);))
组的首地址,设指向指针的指针变量P,它
pri
在第一次执行循环时,赋值语句“P—
name+i;”使P指向name的0号元素
(上接第68页)
string str Encoding・UTF8・GetString
//向子网发送信息
sendUdpClient
Send(bytes,bytes.Length。
.
(bytes'0,bytes.Length); multicastIep);
)
catch
}
catch
{
{
break;//退出循环,结束线程
}
MessageBox.Show( 发送失败 );
}
finally
3.4组播组数据的发送
{
sendUdpClient.Close();
组播组数据的发送要注意将Enab1eBroadcast属
性设置为True,如果要跨越子网发送数据,还需设置
Ttl属性,代码如下:
IPEndPoint muhicastIep==new IPEndPoint
(multicastIp,port);
UdpClient sendUdpClient—new UdpClient();
}
4结束语
IP组播是目前计算机网络应用中的一个热点,本
文介绍的实例在.NET Framework 2.0下测试通过,
运行正常,实现了基于局域网的IP组播,对将现有的
sendUdpClient.Enab1eBroadcast—true;//允许
发送和接收广播数据报
相关应用程序移植到.NET平台有一定的借鉴作用。
参考文献
//将发送内容转换为字节数组
string sendString—textBoxSend.Text;
[1] 马 骏,郑逢斌,沈发删.C#I阆络应用高级编程[M].
北京:人民邮电出版社,2006.
byte[-]bytes—System.Text.Encoding.UTF8.
GetBytes(sendString);
try
[2]
Microsoft. msdn2. microsoft. com/zh—cn/library/
aef44ala(VS.80).aspx[CP],2007一O4一O1.
{
[3] Simon Robinson,Christian Nage1.C#高级编程l-M].
北京:清华大学出版社,2005.
版权声明:本文标题:关于指针数组与指向指针的指针教学研究 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1713752742a649937.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论