C语言中指针的运用
C语言中指针的运用
【摘要】C语言是一种被广泛应用的计算机程序设计语言,“指针”是C语言
的精华,是教学的重点和难点,同时又是学好C语言的关键。本文对数组与指
针、字符串与指针、函数与指针等在程序设计中的灵活运用作了探讨。
【关键词】C语言;指针;数组;字符串;函数
C语言把内存存储单元的地址视为一种数据类型,而地址起到指向某个存储
单元的作用,因此常称地址为“指针”,即指针就是地址。指针变量是用于存放指
针(即地址)的变量,该变量的值是一个指针,一个要访问对象的地址。在C
语言中,引入指针变量的目的主要是用来间接访问数据对象,有效地表示复杂的
数据结构。例如:设有指向整型变量的指针变量p,要求指向整型变量a,那么
用C语言可描述为:
int a=100;/*定义整型变量a,并赋初值100*/int*p=&a;/*定义指针变量p,
并将变量a的地址送给p*/用图表示为:
要存取变量a的值,有两种方法可以完成。一种可通过变量名直接对内存单
元进行存取操作,这种方式称为直接访问。另一种方式:先找到存放“a的地址”
的变量p,从中取出a的地址(2000),然后到这个地址中对a进行存取a的值,
这种访问方式称为间接访问。通过对变量p进行取内容运算*p值就得到a的值
100。
有时为了方便,常将指针变量简称为指针。正确而灵活地运用指针不仅能够
提高效C程序的效率,而且能有效地表示复杂的数据结构。所以指针的主要用
途有:进行指针运算;引用数组元素;使用字符串;作为函数参数,实现地址传
递;处理链表等等。
1.指针运算
指针的运算主要指指针的算术运算,其实质就是指向的地址发生变化。指针
实际增(减)多少由指针的类型决定。指针加上(或减去)一个整数n,表示将
指针由当前位置移动到后面(或前面)的第n个数据处。两个指针相减,表示两
指针所指向的地址相减。得到两指针之间数据的个数,结果是一个整数,而不是
地址值。如:
int a[5]={2,4,6,8,10};/*定义一个整型数组a并初始化*/
int*p=a,*q=a;/*定义指针p和q,均指向a数组的首地址*/
当p=p+2时,表示将指针p向后移动的二个数据,移向了a数组中第3个数
组元素(即6),p-q结果为p与q这两个指针之间数据的个数等于2。利用这个
特点,若将p指向数组a的首地址,将p移到a数组的末尾,则用p-q就可以求
出数组a的长度,即a中数据的个数。
2.数组与指针
数组在内存中占据一块连续的存储区,数组名代表这个区域的起始地址,即
数据名是一个指向该数组首地址的常量指针。当指针指向一维数组首地址后,C
语言可有4种直接访问该数组的第i个元素的方法:“数组名[i]”,“指针名[i]”,“*
(指针名+i)”,“*(数组名+i)”。前两种使用了数组的下标,称为“下标法”。
后面两种使用指针运算符,称为“指针法”。
如:int a[10],*p=a;
则:对数组元素a[i](0<=i<=9)有四种等价访问方法:
a[i]或p[i](下标法);*(a+i)或*(p+i)(指针法)
例如:以下程序有两个功能完成的函数(计算数组中各元素值的总和)。
int sum1(int a[],int n)/*函数1*/
{int sum=0,*p,*q=a+n;
for(p=a;p<q;p++)
sum+=*p;
return(sum);
}
int sum2(int a[],int n)/*函数2*/
{int sum=0,i;
for(i=0;i
return(sum);
}
main()
{int a[5]={2,4,6,8,10};
printf(“%d”,sum1(a,5));
printf(“%d”,sum2(a,5));
}
上述主程序分别调用sum1()和sum2(),调用结果都为30,说明sum1
()与sum2()功能完成相同,从表面看来,函数2似乎比函数1简单、直观,
但其执行速度sum1比sum2要快,效率要高。
3.字符串与指针
访问一个字符串,除了用字符数组外,还可以定义一个字符指针,用字符指
针指向字符串中的字符。如:char*p=“C Program”;这样,可以方便地用字符指
针p来处理字符串。
如:打印图案:
*
**
***
****
*****
下面3个程序都能实现”
程序1:
main()
{int i,j;
for(i=1;i<=5;i++)
{for(j=1;j<=i;j++)
printf(“*”);
printf(“\n”);
}
}
程序2:
Void gra(int n)
{int j;
for(j=1;j<=n;j++)
printf(“*”);
printf(”\n”);
}
main()
{int i;
for(i=1;i<=5;i++)
gra(i);
}
浅谈C语言程序设计中的指针
i nt a r ay[10] ; r
i nt * Pa :
a & P 二 : a i n t * * Pt r 级Pa :
*pt r 级b宝
P a二 r r s y : a
从语法的角度看,把指针声明语句里的指针名和名字左边的指针声明 符*去掉,剩下的部分就是这个指针所指向的类型。例一中指针所指向的
一、指针的橄念
指针是一个特殊的变量, 它的值是内存的一个地址。要理解指针需要 理解三方面的内容: 指针的类型,指针所指向的类型,指针的值或者叫指 针所指向的内存区。下面举例说明。例一: ( 1) i nt *pt r : ( 2) char*pt r ; ( 3) i nt (知t r ) [3] : (4) i nt * ( *pt r ) [4] : (一) 指针的类型 从语法的角度看,把指针声明语句里的指针名去掉,剩下的部分就是 这个指针的类型。这是指针本身所具有的类型。例一中各指针的类型如下: ( 1) int *pt r ; / * 指针的类型是i nt * */ (2) cha *pt r : r * / 指针的类型是char* */ (3) 加t ( *pt r ) [3] ; / * 指针的 类型是i nt (*) 〔 3] */ (4) int * (知t r ) [4] : / * 指针的类 型是i nt * ( *) [4] */ ( 二) 指针所指向的类型 当通过指针来访问指针所指向的内存区时,指针所指向的内存区存储
指针。举例如下: 例五:
( 三) 指针的值 指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,
i nt ar r ay[10]二 {0,1,2,3,4,5,6,7,8,9},value;
而不是一般的数值。指针所指向的内存区就是从指针的值所代表的那个内 存地址开始,长度为s z o ( 指针所指向的类型) 的一片内存区。如果一 i e f 个指针的值是x ,就相当于该指针指向了以联为首地址的一片内存区域。 x 二、指针的茸术运, 指针可以加上或减去一个整数,这和C语言中的算术表达式意义是不 同的. 例二: ( 1) int a [20] ; (2) i nt 却t r二; (3) …… (4) pt r + : a 在上例中,指针pt 的类型是i t *,它指向的类型是i n ,它被初始 r n t 化为指向数组a 的起始地址,接下来的第4句中,指针pt 被加了1,编译器 r 编译程序时把指针pt r 的值加上了si zeof ( int ) . 由于i n 型在3 位机中的长度是四个字节,故原来pt 指向 t 2 r 数组第0号 单元开始的四个字节, 此时指向 数组从第4号单元开始的四个字节。 三、运算符&和. 几 是取地址运算符, *是指针运算符或称为间接访问运算符. & 的运算 a 结果是一个地址,即变量a 的地址. *p为指针变量p所指向的存储单元的 内容,即p所指向的变量的值. 下面举例说明。 例三:
C语言中的指针
【 yw r s CL nug ; o t ; prt n ary fnt n Ke od 】 g ae pi e oea o ;r ;u ci a nr i a o
C语 言是计 算机程序设计语言中专业性最强 的语言之一 , 其 中指针是 C语言中的精髓 ,它在 C语言编程 中被广泛 的使 用 。在某 些场合 ,指针是使 运算 得 以解决 的唯一途径 ,同时 正确 而灵 活的掌握运用它 ,可以提高程序 的运行速度 ,从而 有效地表示和实现复杂数据结构。
WE n IYa g
(ih a iest fS in e n ie rg Zio g6 3 0 Sc u n Unv ri o ce c &E gn en , g n 4 0 0) y
【 btat Acr c a df x l ue f one, i c ladk ypita el s h sec f nu g,stem s A s c 】 or t n ei e s it ad ut n e on s la eesneo l gae i h ot r e l b op r i f s w t Ca
P一一 P+i P—i
P+=i P一=i
/ / 向前 一 个对 象 D指 , / 当前对象后第 i 个对象 / / 当前对象前第 i 个对象 , , D指向当前对象后第 i 个对象 , , D指向当前对象前第 i 个对象
23 两 个 指 针 变 量相 减 .
1 概念
C语言中处理变量 、数组 、函数 、文件时 ,需要由操作系
统 把 这 些 量 调 入 内 存 的 不 同存 储 单 元 中 ,每 个 内存 单 元 都 对
若 两个指针变量指 向同一个数组 的元素 ,则 两指针变量
C语言中指针的应用
2) 17年 4月 X
Ap . 0 7 r2 0
【 计算机与信息工程】
C语 言 中指 针 的应 用 。
杨 立 2 ,
(. I山西大学 计算机与信息技 术学 院 , 太原 0 oo ; . 3o62 运城学院 公共计算机 教学部 , 山西 运城 o4 0 ) 40 o
摘要 : 针的使用 是 c语言程序设计中一个重 要的特色 . 指 从指针 的定 义和指针 的类 型等方 面对 c
变量存放 的是指 向变 量 的地 址 , 指 向变 量 存 放 的是 数 而
据.
数据结构 , 动态分 配存储 空间 , 方便地 引用字符 串和数组 , 在 函数调用中获得多个返 回值 , 可以直 接处 理 内存地 并且 址等等 . 而灵 活的运 用指针可 使程序 简洁 、 正确 明快 , 大大 提高程序 的灵 活性 和运 行速 度 . 是 由于指 针太 过灵 活 , 但 旦使用不 当 , 错 误难查 , 不仅 而且会 出现 意想 不到 的错
t n a d t e t e o e p i t ,ti p p r n lzs te c n e t f e p i tr f mgan ln u g ,s m— i n p ft ne h s a e ay e o c p n e p rr a g a e u o h y h o r a h o t o h o C ma i s te b s p l ain o e p itri mg an l g a e r e a i a pi t ft n e C p rr n u g . z h c c o h o n a Ke r s r ga l g a e o itr ra y wo d :C p o rm u g ;p n e ;a ry n a
浅谈C语言中指针变量的定义与应用
中 国 管 理 信 息 化
Chn n g m e t no main z t n i aMa a e n f r to iai I o
Fb,00 e .2 1
Vo .3. 4 11 No.
第l 3卷第 4 期
浅谈 C语言中指针变量的定义与应用
王 冉, 陶秋 红
( 石家庄职 工大学 , 石家庄 0 0 4 ) 5 0 1
[ 要] 摘 指针是 C ; .- a- ,x f 的重要 内容, 而灵活地使用它, . - 正确 可以帮助我们解决许 多实际问题 。本文介绍 了 指针变量 的定义与指针运算符 , 并且通过例题讲 解复杂指针的应用, 以使读者进一步理解、 掌握。
的培养 , 就是‘ 这 模式 中的“” l。
[ ]赵 志群 . 工 学结 合 课 程 的认 识( [] 职教 论 坛 ,0 84 . 2 对 二)J . 20() [] 大源. 3姜 职业 教 育 :职业 培 训 与 教育 辩 ]. 中国 职业 技 术 教 育 ,
2 0 () 0 84.
一
、
三、 针的应用 指
[ 收稿 日期 ] 0 — 3 3 2 90— 1 0 [ 作者简介 ] 陶秋 ̄(90 ) 17 - , 河北保定人 , 石家庄职工大学讲师, 主要
研 究方 向: 算机应 用。 计
一
1简单 的指向变量 的指针 和指 向指针 的指针 . () 1简单 的指 向变量 的指针 。 般形式 : 据类型标识 符 指 针变量 名: 数
从 图 2可 以看 出 . 整个课 程体 系 的核 心是构 建 4个 平 开发层 面 , 然 它是 指导 和实施 教学 的纲 领性 框 架 . 真 虽 但
浅谈C语言中指针的用法
2指针 的概 念
内 存 空 间 是 以 字 节 (y ) b t 为单 位 用 来 存 储 数 据 的 一 段 区 城 , e 其 中每 一个 字 节 都 有 一 个 编号 , 编 号 称 为该 字 节 的地 址 。 不 同 该 的数 据 在 内 存 中被 分 配 的 字 节 数 一 般 是 不 相 同 的 , 样 对 每 一 种 这 数 据 就 对 应 着 若 干 个 地 址 编 号 . 些 地 址 中 第 一 个 字 节 的地 址 就 这 称 为 该 数 据 的指 针 , 储 该 指 针 的变 量 就 称 为 指 向该 数 据 的 指 针 存 变 量 。 如 下 图 1所示 ,0 o和 1 0 10 0 2是 变 量 a b的 指 针 , 两 个 指 , 这 针 值 在 变 量 p i lpit on 、on2中存 储 , 以 p i l p i 2是 指 向 a t 所 on 和 on t t 、 b的 指 针 变 量 , 、 a b是 p it 、 o t o l p i 2的 目标 变 量 ,0 0和 2 0 n n 20 0 2是 pit、o t o l pi 2的指 针 。 指针 变 量 pit n n o l和 pit 指 向关 系如 图 n o 2的 n
、 研
.
维普资讯
究 开 发 . .. . . .
电 脑 知 识 与 技 术
浅谈 C语言 中指针 的用法
刘 平 。赵 焕 平
( 阳理 工 学 院计 算 机 科 学 与技 术 系 , 南 南 阳 43 0 ) 南 河 7 00 摘 要 : 针 是 C 语 言的 核 心 。利 用 它 可 以表 示 多种 数 据 结构 , 指针 与普 通 变 量 、 组 、 指 把 数 函数 结合 可 以设 计 出灵 活 高效 的 程 序 。本 文 针 对 指针 的 这 些 常 见 用 法进 行 了具 体 的 分析
C语言指针研究
中 分 号 T 文 标 声二 文 编 : 1671一 图 类 : p3 献 识马 A 章 号 7597 (2008) 0120030一 01
一、 C语盲指针极况
卜
在计算机中,所有的数据及程序都是存放在存储器中的,一般把存储 器中的一个字节空间称为一个内存单元,为了正确地访问这些内存单元, 必须为每个内存单元编上号,根据内存单元的编号即可准确地找到该内存 单元,内存单元的编号称为地址,根据内存单元的地址就可以找到所需要 的内存单元,通常也把这个地址称为指针。指针的作用是可以通过指针去 访问内存单元。根据指针所指的量的不同,指针可以分类为: ①指向简单
参考文献: 【 张丽霞, ( C语言指针详解》,载 《 1」 赤峰学院学报 ( 自 然科学版) 》 2005年10月。 巴 余建宝, 《 〕 C语言指针探究》, 《 载 科技经济市场》200 年8月。 6 【 温娟娟, 《 3〕 C语言中指针的探讨》,载 《 河南职业技术师范学院学 报》 2003年9月。 〔 陈宝平,催澄荣, 《 4〕 C指针用法分析》,载 《 内蒙古经济管理干部学院 学报 (季刊) 》, 2000年9月。
信怠 科学
从 LLE Y
SI L I C O N
巍纂
c语 言指针研究
娄浩韬
(西北民 族大学计算机科学与信息工程学院 甘肃 兰州 730124)
[摘 要〕 指针是C 语言的精华,抛开指针的c语言是没有生命力的。我们认为深入理解指针的本质含义,对指针进行理性分析和研究将有助于我们进一步加深对
C语言程序编程的认识和应用。 [关键词〕 C语言 指针 指针用法
会一 将错就错。地执行下去。所以在使用C语言编程,特别是使用指针时要 特别小心,否则,可能会得到一个一 莫名其妙。的结果,有时甚至会出现系 统死机,不能正常结束的现象。C语言中的指针使用起来有这么大的危险, 但C语言的指针为我们所提供的优点是远远大于它的缺点的,在使用C语言 的指针的时候只要注意上面提到的问题即可扬其长而避其短。 四、C语,指针应用的优点 指针是C语言的一个重要概念,也是C 语言的一个重要组成部分,正确 灵活地使用指针,能帮助我们解决许多实际问题。概括的来说,主要有: ①指向单变量的指针变量作为函数参数,可以得到多个变化了的值,即函 数调用可以而且只可以得到一个返回值,而运用指针变量参数,就可以得 到多个变化了的值。②指向数组元素的指针变量处理数组,可以大大提高 执行效率,所以指针使用熟练时,尽量使用指针处理数组; ③指向字符串 的指针变量构成指针数组处理多个字符串时可以节省内存空间,还可以提 高程序的执行效率; ④指向结构体变量的指针作函数参数,可以节省时间 和空间,提高执行效率; ⑤指向FILE类型结构体的指针变量,可以找到与 之相关的文件,从而实现对文件的访问; ⑥指向函数的指针作函数参数, 可以使一个通用函数实现各种专用功能。 指针是C 语言中十分重要的一个概念,是C语言的灵魂、精华与根本所 在。本文对指针的有关概念进行了介绍和区分,对指针使用不当的危害性 进行了描述,并对其应用的有点进行了总结,希望能对我们进一步认识和 研究C 语言指针有所帮助。
c语言数组传方法
c语言数组传方法数组是C语言中常用的一种数据结构,它可以存储多个相同类型的元素。
在C语言中,数组可以通过传递指针的方式来在函数之间进行传递。
本文将详细介绍C语言中数组的传递方法。
C语言中,数组的传递可以通过两种方式实现:传递数组的指针或者传递数组的首地址。
下面将分别介绍这两种传递方式的具体方法。
1. 传递数组的指针传递数组的指针是C语言中最常用的数组传递方式。
当我们将数组传递给一个函数时,实际上是将数组的首地址传递给了函数。
函数内部可以通过操作指针来对数组进行读取和修改。
例如,我们定义了一个函数`printArray`,该函数接受一个整型数组的指针和数组的长度作为参数,用于打印数组的元素:```cvoid printArray(int *arr, int length) {for (int i = 0; i < length; i++) {printf("%d ", arr[i]);}printf("\n");}```在主函数中定义一个整型数组,并调用`printArray`函数进行打印:```cint main() {int arr[] = {1, 2, 3, 4, 5};int length = sizeof(arr) / sizeof(arr[0]);printArray(arr, length);return 0;}```上述代码中,我们通过`printArray`函数打印了数组`arr`的元素。
2. 传递数组的首地址除了传递数组的指针外,我们还可以直接传递数组的首地址给函数。
在函数内部,可以通过数组指针的方式对数组进行访问和修改。
例如,我们定义了一个函数`modifyArray`,该函数接受一个整型数组的首地址和数组的长度作为参数,用于修改数组的元素:```cvoid modifyArray(int arr[], int length) {for (int i = 0; i < length; i++) {arr[i] += 1;}}```在主函数中定义一个整型数组,并调用`modifyArray`函数进行修改:```cint main() {int arr[] = {1, 2, 3, 4, 5};int length = sizeof(arr) / sizeof(arr[0]);modifyArray(arr, length);printArray(arr, length);return 0;}```上述代码中,我们通过`modifyArray`函数对数组`arr`的元素进行了加一操作,并通过`printArray`函数打印了修改后的数组。
C语言中指针中的值赋值给数组
C语⾔中指针中的值赋值给数组 如果把各种语⾔做个冷兵器类⽐的话,C语⾔⼀定是⼑客的最佳⼯具.⼊门很简单,但是要是能把它熟练运⽤,那就是顶尖级别的⾼⼿了.⽤了那么多年的C语⾔,发现⾃⼰还是仅仅处于熟练的操作⼯.今天遇到了⼀个bug,就是和指针的赋值有关系.请看代码:1 #include <stdio.h>23static int array[2];4int main()5 {67int *ptest = NULL;89 ptest = (int*)malloc(2*sizeof(int));1011 ptest[0] = 32767;12 ptest[1] = -32767;1314 array = ptest;15 printf("val1:%d val2:%d \n",array[0],array[1]);1617return0;1819 }20 ~ 各位看官,能否看到这个代码的问题吗? 其实,这段代码有个严重的问题,就是把指针的地址指向了数组的地址,就是把⼀个值打算放到两个地址中,这个是肯定不对的了.让在复杂的代码丛林中,没有意识到这个⽤法时候,那就很容易把指针混为⼀体.假如array是个指针的话,那这份代码九对了. 正确的写法如下所⽰:1 #include <stdio.h>23//static int array[2];4int *array= NULL;5int main()6 {78int *ptest = NULL;910 ptest = (int*)malloc(2*sizeof(int));1112 ptest[0] = 32767;13 ptest[1] = -32767;1415 array = ptest;16 printf("val1:%d val2:%d \n",array[0],array[1]);1718return0;1920 } 对C语⾔基本功的训练,看来不能松懈啊.。
解析C语言中空指针、空指针常量、NULL0的详解
解析C语⾔中空指针、空指针常量、NULL0的详解[6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.这⾥告诉我们:0、0L、'\0'、3 - 3、0 * 17 (它们都是“integer constant expression”)以及 (void*)0 (tyc:我觉得(void*)0应该算是⼀个空指针吧,更恰当⼀点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是⼀个空指针值)。
⾄于系统选取哪种形式作为空指针常量使⽤,则是实现相关的。
⼀般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L);⾄于C++ 系统,由于存在严格的类型转化的要求,void* 不能象 C 中那样⾃由转换为其它指针类型,所以通常选 0 作为空指针常量(tyc: C++标准推荐),⽽不选择 (void*)0。
[6.3.2.3-3] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.因此,如果 p 是⼀个指针变量,则 p = 0;、p = 0L;、p = '\0';、p = 3 - 3;、p = 0 * 17; 中的任何⼀种赋值操作之后(对于 C 来说还可以是 p = (void*)0;), p 都成为⼀个空指针,由系统保证空指针不指向任何实际的对象或者函数。
C语言中指针变量的用法
p i
形 象地 表 示
解 码后 的原始状 态
图 1 相关变量存储状态简 图
在程序 中可以通过变 量 i 直 接 使 用 相 关 的存 储 单 元, 例如表达式 i + 3实 为 5 + 3 , 值为 8 指针 变 量 p i 保 存
程 序 中使用 指针 变 量通 常并 非关 注 其存 储 的数
3 指 针 变 量 可 以指 向的存 储 单 元 的类 型
指 针 变 量 指 向 的 存 储 单 元 可 以 是 普 通 的类 型 . 如
p i 也标识 了变量 i 相关 的存储单元 , 即在使用存储 单
元 时 既可 以 用变 量 i , 也 可 以用 p i 。通 过 变量 i 直 接 使 用存 储 单 元 的方 式 称 为 直 接 引用 :由 于 操 作 符 是 间 接 引 用 操作 符 , 故 称通 过 表 达 式 p i 使用 存 储 单 元 的方 式 为 间 接 引 用 直 接 使 用 的方 式 虽 然 简 便 但 受 变 量 作 用 域 的 限制 只要 获 得 了存 储 单 元 的 地 址 就 能 以 问接 引 用 的方 式 使 用 存 储 单 元 .间接 引用 的 方 式 可 以扩 展 存储 单 元 的 使 用 范 围 。 以下 面 的程 序 为 例 :
关键词 :
指针 ; 存储单元 : C语言
1 指 针 变 量 与 普 通 变 量 的异 同
变量标识 了计算机 内存 中的存储单 元 .用于存储
数据 。 存 储 单 元 是 内存 块 在 C语 言 中 的抽 象 . 具 有 固定
类似 i n t j = i ; , 语句 i n t * p j = p i ; N 以使 整 型 指 针 变 量 p J 也 存 储 了变 量 i 的地 址 .即整 型指 针 变 量 p J 也 指 向 了 整 型变量 i 。但 表达 式 p i + 3实 为 一 个 地 址 加 3 , 对 于 不 熟 悉 的地 址 数 据 .只有 定 义 了 加 法 的 意 义 才 能 确 定 计 算 结果 。
