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. 


本文标签: 指针 数组 字符串 指向 数据