全的C语言指针详解.ppt_第1页
全的C语言指针详解.ppt_第2页
全的C语言指针详解.ppt_第3页
全的C语言指针详解.ppt_第4页
全的C语言指针详解.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章 指针 n6.1 指针定义与使用 n6.2 指针与函数 n6.3 指针与数组 n6.4 指针与字符串 n6.5 指针数组与多级指针 n6.6 指针与动态内存分配 n6.7 指针的深层应用 6.1 指针的引出 一. 地址与指针 1. 地址与取地址运算 C程序中的变量在内存中占有一个可标识的存储区, 每一个存储区是由若干个字节组成, 每一个字节都有 自己的地址, 而一个存储区的 地址是指该存储区中 第一个字节的地址 C语言允许在程序中使用变量的地址 ( 通过地址运算符 变量 x 的地址 - 数组变量 a 的地址 - 数组名 a 2. 指针与指针变量 (1) 变量的访问方式 直接访问 : 通过变量名或地址访问变量的存储区 例 : scanf ( “%d” , x = sqrt(x) ; printf ( “%d” , x ) ; 间接访问 : 将一个变量的地址存放在另一个变量中. 如将变量 x 的地址存放在 变量p 中, 访问x 时先找到p, 再由p 中存放的地址找到 x px 2012 1010 1010 (2) 指针: 一个变量的指针就是该变量的地址(指针就是地址) (3) 指针变量: 存放变量地址的变量, 它用来指向另一个变量 二、 指针变量的定义 1. 格式 : 数据类型 * 指针变量名 ; 例 int *p1 ; char *p2 ; 2. 说明 : (1) 在变量定义时, * 号表示该变量是指针变量 ( 注意: 指针变量是p1 , p2 , 不是*p1 , *p2 ) (2) 定义指针变量后, 系统为其分配存储空间, 用以存放 其他变量的地址, 但在对指针变量赋值前, 它并没有 确定的值, 也不指向一个确定的变量 例: int x , *p ; x = 5 ; px 2012 1010 51234 注: 指针变量p的值是随机值, 此时p 和 x 并无关联 (3) 使指针变量指向一个确定的变量必须进行赋值 int x , *p ; x = 5 ; p = px 2012 1010 51010 三、 指针变量的引用 1. 指针运算符 * (1) p与*p不同, p是指针变量, p的值是p所指向的变量的地址 *p 是p 所指向的变量 , *p的值是p所指向的变量的值 *p 的值为 5(*p 表示 x) , 而p 的值为 1010 (2) 引用指针变量时的 * 与 定义指针变量时的 * 不同 定义变量时的 * 只是表示其后的变量是指针变量 int a , *p ; p = scanf ( “%d” , p ) ; printf (“%dn” , *p ) ; *p = 12 ; printf (“%dn” , *p ) ; pa 2012 1010 5101012 让p指向a 对a 重新赋值 等价于 a=12 即 * p 的值为a 的地址, *p 的值为2 p 的值不变 , *p 的值为 3 (2) c = *p+ ; c = *(p+) ; c = *p ; p+ ; 执行后 c 的值为 3 , *p 的值为 5 (3) d = *+p ; d = *(+p) ; +p ; d = *p ; 执行后 d 的值为 3 , *p 的值为 3 p 2012 1010 1010 (1) p = (*p)+ ; ( 等价于 a+ ; ) 1012 3 3 10143 例6. 2 #include void main( ) int *p1 , *p2 , *p , a , b ; scanf(“%d%d”, p1 = p2 = if (a void swap( int x , int y) int temp; temp = x ; x = y; y = temp; void main( ) int a , b ; scanf(“%d%d”, if (a void swap1(int *p1 , int *p2) int temp; temp = *p1 ; *p1 = *p2; *p2 = temp; void main( ) int a , b , *pt1 , *pt2 ; scanf(“%d%d”, pt1 = pt2 = if (a void swap2( int *p1, int *p2) int *temp; *temp = *p1 ; *p1 = *p2; *p2 = *temp; 说明: 这种方法可能会破坏系统的正常 工作状态,因为temp是一个指针变量 但是在函数中并没有给temp一个确定 的地址,这样它所指向的内存单元是 不可预见的,而对*temp的赋值可能 带来危害 a b pt1 pt2 main p = p1 ; p1 = p2; p2 = p; p1 p2 p 例: int * fun ( int a , int b ) 函数体 ; 说明: 定义一个返回指针值的函数与以前定义函数格式 基本类似, 只是在函数名前加 * , 它表明该函数返回一个 指针值 , 而这个指针值是指向一个 int 型数据 二、函数返回 指针 例: #include #include #define SIZE 100 char bufSIZE ; char *p=buf ; char *alloc( int n) char *begin ; if ( p+n int add( int b , int n); void main( ) int a6= 1, 3, 5, 7, 9, 11, total ; int (*pt) ( int b , int n ) ; pt = add ; total = (*pt) ( a , 6 ) ; printf( “total = %d n” ,total ) ; int add( int b , int n ) int i , sum = 0 ; for ( i = 0 ; i void main( ) int a5 = 1, 3, 5 ,7 ,9 , *p , j ; for ( p=a ; p void inv1( int x , int n ) int temp, i , j , m=(n-1)/2; for( i=0 ; i void inv2(int *x , int n) int temp, m=(n-1)/2; int *p , *i , *j ; i=x ; j=x+n-1; p=x+m; for( ; i void inv3(int *x , int n); void main( ) int *p , a6=1, 3, 4, 6, 7, 9; p = a ; inv3( p , 6 ); for( p=a ; p void inv4(int x , int n); void main( ) int *p, a6=1, 3, 4, 6, 7, 9; p = a ; inv4( p , 6 ) ; for( p=a ; p int max , min ; void m1(int arr , int n) int *p , *end ; end=arr+n ; max=min=*arr ; for(p=arr+1 ; pmax ) max=*p ; else if( *p void main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int *p; for( p=a0; p void main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int (*p)4, i, j; p=a; for( i=0; i #include #define MAXLEN 256 #define N 4 void main( ) int i, j; char tempMAXLEN; char nameNMAXLEN=“Pascal“,“VC“,“Basic“,“Java“; for(i=0; i0) strcpy(temp, namei); strcpy(namei, namej); strcpy(namej, temp); 选择法排序 /书名的最大长度+1 指向二维数组元素的指针 比较两个字符 串大小 复制字符串 Quiz 选择法排序 Assignment 1、将数组a23中的每个元素向右移一列, 最后一列 换到最左一列(如右图所示) 要求:必须用指针实现 321 654 =a 213 546 2、将数组aMN中的每个元素 向右移一列, 最后一列换到最左 一列 要求:必须用指针实现 Experiment 实验题目:指向二维数组的指针编程 实验目的:深入理解如何用指针变量表示二维数组的 元素和元素的地址,学会用指向二维数组 的指针变量作函数参数 实验内容:编程找出二维数组中的鞍点,二维数组的 鞍点是指在该位置上的元素在该行上最大 , 在该列上最小,也可能没有鞍点。要求必 须用指针实现。 编写一个找鞍点的函数,用指向二维数组 的指针变量作函数参数 6.4 指针与字符串 一、字符指针 1. 定义指向字符串的指针变量 char *p = “China”; 说明 : 这里没有定义字符数组, 但字符串在内存中还是以数组 形式存放的. 字符串在内存中 占有一片连续的存储单元, 以0结束 注意 : 赋值只是把字符串的首地址赋给p , 而不是把字符串赋给 p, p 是一个指针变量, 它不能存放一个字符串, 只能存放一个地址 C h i n a 0 2460 2461 2462 2463 2464 2465 2460 p 将字符串的 首地址赋给p 2. 输出字符串: printf(“%sn” , p ) ; 输出字符串时, 先输出p 指向的 第一个字符, 然后系统自动执行p+, 使p 指向下一个字符, 再输出该字符, 直到遇到0 为止 也可以用循环逐个输出字符串中的字符: for ( ; *p!=0; p+ ) printf(“%c”, *p ) ; C h i n a 0 2460 2461 2462 2463 2464 2465 2460 p 24612462246324642465 二、 字符数组与字符指针变量的区别 char s =“C Language” ; char *p =“C Language” ; 1. 存储方式不同: s 存放的是字符串中的字符和0 p 存放的是字符串的首地址 2. 虽然s 和p 都能代表字符串的首地址, 但s是数组名, 是一个常量, 而p是一个指针变量, 因此 s+ 的 写法是错的, 而p+ 的写法是对的 char *p1, *p2 = “abcd”; p1 = “China” ; char s12 , str = “good” ; s12 = “China” ; s = “China” ; 3. 赋值方式不同 s 可以进行初始化, 但不能使用赋值语句 p 既可以初始化, 也可以赋值 错 4. 定义数组s 时, 系统会给s 分配一片连续的存储单元 定义指针变量p 时, 只给p 分配一个存储单元 三、字符串指针作函数参数 例6. 20 实现字符串复制 void copystr(char from , char to ) int i = 0 ; while ( fromi!=0 ) toi = fromi ; i+; toi = 0 ; void mani( ) char a = “cat” , b = “tiger”; puts(a); puts(b); copystr(a , b); puts(a); puts(b); c a t 0 t i g e r 0 ab froma tob c a t 0 相当于bi=ai 例 6. 2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论