SlideShare ist ein Scribd-Unternehmen logo
1 von 65
-- 存储单元地址的使用
教学目标 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
基本数据类型回顾 ,[object Object],[object Object],[object Object]
指针引入 除了上述 值型 数据, C 语言还能处理一类非常特殊的数据 — 内存地址 。 计算机内部有很多存储 单元, 每个存储单元 都用 唯一的 地址编号 ( 表示为一个整数 加以 相互区别 ) ,简称为 地址 。 在 C 语言中,存储地址也叫 指针
6.1 指针与指针变量 ,[object Object],[object Object],[object Object],[object Object],[object Object]
6.1 指针与指针变量 ,[object Object],[object Object],[object Object],变量的名称 变量的存储单元 2000 变量的指针 变量的值 1.0
6.1 指针与指针变量 整型指针的存储 整型变量的存储
6.2  指针变量的定义与引用 ,[object Object],变量须先定义后使用 使用指针变量前,必须先对它们进行声明。指针变量的声明语法 : 基本数据类型说明符   * 标识符名称 ; (a) int 指针变量   (b)  float 指针变量   (c) char 指针变量 如: int  *ptr1; float *ptr2; char  *ptr3;
6.2.1  指针变量的定义 ,[object Object],[object Object],[object Object],[object Object],[object Object]
6.2.2  指针变量的引用 ,[object Object],int  *p1  , m = 3; float *p2,  f = 4.5; char  *p3,  ch= 'a'; int  *intPtr; p1 = &m ;  p2 = &f ;  p3 = &ch ; intPtr = p1; 运算符 & 的含义是取出变量 m 在内存中的存储指针
6.2.2  指针变量的引用 指针变量可以指向任何与之相一致的数据类型的变量, 没有赋值时, 指针变量的值是不确定的,从而不能确定它具体的指向, 只有 为其赋值,指 针 变量才有意义 对指针变量的引用形式为: * 指针变量  其含义是取出指针变量所指向内存单元中的值
6.2.2  指针变量的引用 [ 例 6.1]  用指针变量进行输入、输出。 int main( ){ int *p,m; scanf("%d" , &m);  /*  & :取变量 m 的指针  */ p = &m;   /*  指针 p 指向变量 m */ printf("%d  ",*p);  /*  *p 是对指针所指的变量的引 用形式 , 与 m 意义相同  */ printf("%x",p);  /*  输出指针变量 p 中的指针,指 针是以整数形式表示的  */ return 0; }
6.2.2  指针变量的引用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],用普通整型变量 m 的指针初始化变量 dblPtr 指针变量不指向任何浮点数 , 空指针 strPtr 指针变量不指向任何整型数 , 空指针
6.2.2  指针变量的引用 ,[object Object],[object Object],[object Object],[object Object]
6.3  指针运算符与指针表达式 ,[object Object],[object Object],[object Object],[object Object],变量的定义 类型 & 运算符表达式 含义 char ch; char &ch 取出变量 ch 的指针 double x; double &x 取出变量 x 的指针 int i; int &i 取出变量 i 的指针 int a[10]; int &a[1] 取出数组元素 a[1] 的指针 char str[10]; char &str 取出数组元素 str[0] 的指针
6.3.1  指针运算符与指针表达式 ,[object Object],变量的定义 含义 char *ptrch,ch; ptrch = &ch; printf("%c",*ptrch); 定义指向 char 的指针变量 ptrch 和 char 变量 ch 取出变量 ch 的指针赋值给指针变量 ptrch 以字符方式输出间接访问 ptrch 所指向的指针中的值 double *ptrx,x; ptrx = &x; printf("%lf",*ptrx); 定义指向 double 的指针变量 ptrx 和 double 变量 x 取出变量 x 的指针赋值给指针变量 ptrx 以浮点数方式输出间接访问 ptrx 所指向的指针中的值 int *ptri,i; ptri = &I; printf("%d",*ptri); 定义指向 int 的指针变量 ptri 和 int 变量 i 取出变量 i 的指针赋值给指针变量 ptri 以整型方式输出间接访问 ptri 所指向的指针中的值
6.3.1  指针运算符与指针表达式 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
#include <stdio.h> int main ( ){   int *ptra,*ptrb,a,b,t;  /*  定义指针变量与整型变量   */   scanf( &quot;%d,%d&quot; , &a , &b ) ;   ptra=&a;  /*  使指针变量指向整型变量   */   ptrb=&b;   if(*ptra <*ptrb ){/* 通过间接访问形式交换两个单元的值   */   t = *ptra; *ptra = *ptrb;  *ptrb = t;   }   printf( &quot;a=%d,b=%d&quot; , a, b ) ;   printf( &quot;*ptra=%d, *ptrb%d&quot;, *ptra, *ptrb );   return 0; } ,[object Object]
6.3.1  指针运算符与指针表达式 ,[object Object]
6.3.1  指针运算符与指针表达式 ,[object Object],#include <stdio.h> int main ( ){ int *ptra,*ptrb,a,b,*t; /*  定义指针变量与整型变量  */ scanf( &quot;%d,%d&quot; , &a, &b ) ; ptra=&a;  /*  使指针变量指向整型变量  */ ptrb=&b; if( *ptra < *ptrb ) {  /* 间接访问交换两个单元的值 */ t = ptra; ptra = ptrb; ptrb = t; } printf( &quot;%d,%d&quot; , a, b ) ; printf( &quot;%d,%d&quot;, *ptra, *ptrb ); return 0; }
6.3.2  指针变量作函数的参数 ,[object Object],[object Object],[object Object],[object Object],考虑下列代码,能实现参数值的互换吗? void swap0( int x, int y ){  int t = x;  x = y;  y = t;  return; } 不能,如何做才能将参数的值交换?
6.3.2  指针变量作函数的参数 ,[object Object],#include <stdio.h> void swap1( int *, int * );  /*  函数声明,形参为指针型数据  */ int main ( ){ int *p1,*p2,a,b; scanf( &quot;%d,%d&quot;, &a , &b ) ; p1 = &a ; p2 = &b ; swap( p1, p2 ) ;  /*  函数调用,实参为指针变量  */ printf( &quot;%d,%d&quot;, a, b ); printf( &quot;%d,%d&quot;, *p1, *p2 ) ; return 0; } /*  实现将两数值调整为由大到小  */ void swap1( int *pt1,int *pt2 ){  int t; /* 交换内存变量的值 */ if (*pt1<*pt2){  t = *pt1;  *pt1 = *pt2; *pt2 = t;  } }  /*  实现将两数值调整为由大到小  */ void swap2( int *pt1,int *pt2 ){  int *t; //  交换 if (*pt1<*pt2){   t = pt1;   pt1 = pt2;    pt2 = t; } }
6.3.3 返回指针的函数 ,[object Object],[object Object],[object Object],[object Object],[object Object]
6.3.3 返回指针的函数 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],/* fun 函数返回形参 x,y 中较大数的指针   */ int *fun(int x,int y){  int *z; if(x>y)z=&x;  else z=&y; return z; } 程序运行结果: 输入: enter two num to i,j: 2 18 输出: max=18
6.4  指针与数组 ,[object Object],[object Object],[object Object]
6.4.1  指针与一维数组 例  int  array[10]; int  *p; p=&array[0]; //   p=array; 或  int  *p=&array[0]; 或  int  *p=array; 数组名是表示数组首地址的地址常量 array[0] array[1] array[2] array[3] array[9] ... 整型指针 p &array[0] p
6.4.1  指针与一维数组 ,[object Object],[object Object],[object Object],[object Object],int a[10], *ptr; /* 声明数组与指针变量 */ ptr = a;  /* 或者: ptr = &a[0];  称为 ptr 指向数组 a*/
6.4.1  指针与一维数组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],合适吗? ptr=a; 程序运行结果: 输入:   1 2 3 4 5 6 7 8 9 10 输出:   1 2 3 4 5 6 7 8 9 10 #include <stdio.h> int main ( ){ int i,a[10],*ptr=a; for ( i = 0; i <= 9; i++ ) scanf ( &quot;%d&quot; , ptr+i ) ;  printf(&quot;&quot;); for ( i = 0; i <= 9; i++ ) printf ( &quot;%4d &quot; , *(ptr+i) ) ;  printf ( &quot;&quot; ) ; return 0; }  #include <stdio.h> int main ( ){ int i,a[10]; for ( i = 0; i <= 9; i++ ) scanf ( &quot;%d&quot; , a+i ) ;  printf(&quot;&quot;); for ( i = 0; i <= 9; i++ ) printf ( &quot;%4d &quot; , *(a+i) ) ;  printf ( &quot;&quot; ) ; return 0; } #include <stdio.h> int main ( ){ int i,a[10],*ptr=a; for ( i = 0; i <= 9; i++ ) scanf ( “%d”, &ptr[i] ) ;  printf(“”); for ( i = 0; i <= 9; i++ ) printf ( “%4d”, ptr[i] ) ;  printf ( “” ) ; return 0; } #include <stdio.h> int main ( ){ int i,a[10],*ptr=a; for ( i = 0; i <= 9; i++ ) scanf ( “%d” , ptr++ );  printf(&quot;&quot;); ptr = a;  for ( i = 0; i <= 9; i++ ) printf ( “%4d ” , *ptr++) ) ;  printf ( “” ) ; return 0; } #include <stdio.h> int main ( ){ int i,a[10],*ptr=a; for ( i = 0; i <= 9; i++ ) scanf ( “%d” , ptr++ ) ;  printf(“”); for ( i = 0; i <= 9; i++ ) printf ( “%4d ” , *ptr++ ) ;  printf ( “” ) ; return 0; }
6.4.2  指针与二维数组 ,[object Object],[object Object],行地址   数组元素 a[0] a[0][0] a[0][1] a[0][2] a[0][3] a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[2] a[2][0] a[2][1] a[2][2] a[2][3]
6.4.2  指针与二维数组 ,[object Object],二维数组元素表示形式: ( 1 ) a[1][2] ( 2 ) *(a[1]+2) ( 3 ) *(*(a+1)+2) ( 4 ) *(&a[0][0]+1*4+2) 地址表示: (1)  a+1  (2)  &a[1][0] (3)  a[1] (4)  *(a+1) 地址表示: (1)  &a[1][2] (2)  a[1]+2 (3)  *(a+1)+2 (4)  &a[0][0]+1*4+2 a[0] 4062196  a[0][0] 4062200  a[0][1] 4062204  a[0][2] 4062208  a[0][3] 4062212  a[1][0] 4062216  a[1][1] 4062220  a[1][2] 4062224  a[1][3] 4062228  a[2][0] 4062232  a[2][1] 4062236  a[2][2] 4062240  a[2][3] a[1] a[2] 行指针 列指针
表示形式 含义 地址 a 二维数组名 ,  数组首地址 ,  指向 一维数组 a[0] ,即第 0 行首地址 a[0],*(a+0),*a 第 0 行第 0 列元素地址 a+1, &a[1] 第 1 行首地址 a[1],*(a+1) 第 1 行第 0 列元素地址 a[1]+2,*(a+1)+2,&a[1][2] 第 1 行第 2 列元素地址 *(a[1]+2),*(*(a+1)+2), a[1][2] 第 1 行第 2 列元素值 4062196 4062196 4062212 4062212 4062220 元素值为 5
6.4.2  指针与二维数组 ,[object Object],#include <stdio.h> int  main( ){ int a[3][4]; int i,j; for( i = 0; i < 3; i++ ) for( j = 0; j < 4; j++ ) scanf( &quot;%d&quot;, a[i]+j ) ;  for( i = 0; i < 3; i++ ){ for( j = 0; j < 4; j++ ) printf(&quot;%4d&quot;,*(a[i]+j));  printf ( &quot;&quot; ) ; } return 0; }   #include <stdio.h> int  main( ){ int a[3][4]; int i,j; for( i = 0; i < 3; i++ ) for( j = 0; j < 4; j++ ) scanf( &quot;%d&quot;, a[i]+j ) ;  for( i = 0; i < 3; i++ ){ for( j = 0; j < 4; j++)  printf(&quot;%4d&quot;,*(a[i]+j));  printf ( &quot;&quot; ) ; } return 0; }
6.4.3  数组指针作函数的参数 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],测试程序的 main() 函数中调用部分如下: ptr = a; maxvalue =  max(ptr, 10);
6.4.3  数组指针作函数的参数 实   参 形   参 数组名 数组名 数组名 指针变量 指针变量 数组名 指针变量 指针变量
6.4.3  数组指针作函数的参数 ,[object Object],[object Object]
6.4.4  指针与字符数组 ,[object Object],[object Object],[object Object],[object Object]
6.4.4  指针与字符数组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
6.4.4  指针与字符数组 ,[object Object],[object Object],[object Object],[object Object],#include <stdio.h> int main( ){ char str[10],*p=str;  int i; /*  输入的字符串长度超过 10 */ scanf(&quot;%s&quot;, str);  for( i=0;i<10;i++) printf(&quot;%c&quot;,*p++); /*  正确输出  */ printf(&quot;&quot;); p=str; /*  字符数组无 ''  标志,输出出错  */  printf(&quot;%s&quot;,p); /*  字符数组无 ''  标志,输出出错  */  puts(str); return 0; }
6.4.4  指针与字符数组 ,[object Object],void strcopy (char *s, const char *t){ while ((*s = *t) != '') {  s++; t++; } } void strcat(char *s, char *t){ /*  移动串 s 到串尾  */ while(*s) s++;  /* 将串 t 接在串 s 后 , 实现串的连接 */  while(*t)  *s++=*t++;  /*  在串结尾处写入结束符  */ *s = '';  }  串复制时,串 s 的长度应大于等于串 t ;串连接时,串 s 的长度应大于等于串 s 与串 t 的长度之和。以免出现存储的溢出。
6.4.4  指针与字符数组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
6.4.4  指针与字符数组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
6.4.4  指针与字符数组 ,[object Object],[object Object],[object Object],分析: 我们定义一个字符串数组来存放多个字符串,每个字符串由两部份构成,如果第一部分一致,再根据第二部分排序,排序依据为字符串的字典顺序。
6.5  指针的地址分配 ,[object Object],[object Object],[object Object],[object Object],在程序执行时为指针变量所做的地址分配就称之为动态内存分配
6.5  指针的地址分配 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
6.5  指针的地址分配 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
6.5  指针的地址分配 printf(&quot;str1------------str2&quot;) ; printf(&quot;%s.......%s&quot;, ptr1,ptr2 ); strcpy(temp,ptr1); /* 串复制  */ strcpy(ptr1,ptr2); strcpy(ptr2,temp); printf(&quot;str1------------str2&quot;); printf(&quot;%s.......%s&quot;,ptr1,ptr2); free(ptr1); free(ptr2); free(temp); return 0; }  例 6-19  续 程序运行结果: 输入:  input str1:Hello input str2:world 输出:  str1------------str2 Hello.......world str1------------str2 world.......Hello
6.6  指针数组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],整型数组,数组元素为整型数 指针数组,数组元素为指针 运算符 [ ] 的优先级比运算符 * 高 先是数组形式 str[4] ,然后才是与“ *” 的结合,表示数组中有四个元素,每个元素都是一个指向字符数据的指针
6.6  指针数组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],数组指针的定义为形式为:   int *pt[4];
6.6  指针数组 ,[object Object],[object Object],[object Object],[object Object]
6.6  指针数组 ,[object Object],[object Object],[object Object]
6.6  指针数组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],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(name[j],name[k])<0)k=j; if(k!=i){   temp=name[i]; name[i]=name[k]; name[k]=temp; } } }  字符串数组排序
6.6  指针数组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],包含三个指针,但指针的指向是不确定的,指针现在可能指向内存的任一地址 若 ptr[i] 没有指向一个有效的地址,非法
6.6  指针数组 ,[object Object],[object Object],分析: 折半查找算法描述: (1) 输入 n 个字符串,分别由指针数组的元素指向。按照字典顺序排序,我们选用上例中的 sort 函数实现。 (2) 设 low 指向指针数组的低端, high 指向指针数组的高端, mid = (low+high)/2 (3) 测试 mid 所指的字符串,是否为要找的字符串。 (4) 若按字典顺序, mid 所指的字符串大于要查找的串,表示被查字符串在 low 和 mid 之间,否则,表示被查字符串在 mid 和 high 之间。 (5) 修改 low 式 high 的值,重新计算 mid ,继续寻找。
6.7  指向指针的指针 ,[object Object],[object Object],[object Object]
6.7  指向指针的指针 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],定义一个指针变量 ptr ,它指向另一个指针变量(该指针变量又指向一个实型变量)
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
6.8  指向函数的指针变量 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],两组括号 ( ) 都不能少 int 表示被指向的函数的类型,即被指向的函数的返回值的类型
6.8  指向函数的指针变量 ,[object Object],[object Object],[object Object],[object Object]
6.8  指向函数的指针变量 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],程序程序结果 : 输入:  Enter two num to a and b:1 2 输出:  max=2 min=1 add=3
6.8  指向函数的指针变量 ,[object Object],[object Object],[object Object],[object Object],[object Object]
6.9 main 函数的参数 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],在命令行窗口里,要用系统的编辑器编辑一个文件
6.9 main 函数的参数 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],启动命令行中的命令行参数的个数 各命令行参数的字符串,最后是一个空指针,表示数组结束
6.9 main 函数的参数 ,[object Object],[object Object],[object Object],[object Object]
6.9 main 函数的参数 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],输入:  echo programming is understanding 输出:  echo programming is understanding
小结 定   义 含   义 int  i; 定义整型变量 i  int  *p = &i;  p 为指向整型数据 i 的指针变量   int  a[n]; 定义含 n 个元素的整型数组 a ,此时 n 为常量 ( 下同 ) int  *p[n]; n 个指向整型数据的指针变量组成的指针数组 p int  (*p)[n]; p 为指向含 n 个元素的一维整型数组的指针变量   int f(); f 为返回整型数的函数   int *p(); p 为返回指针的函数,该指针指向一个整型数据   int (*p)(); p 为指向函数的指针变量,该函数返回整型数   int **p; p 为指针变量,它指向一个指向整型数据的指针变量

Weitere ähnliche Inhalte

Was ist angesagt?

1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
Sita Liu
 
C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能
shademoon
 
第3章算法与控制语句
第3章算法与控制语句第3章算法与控制语句
第3章算法与控制语句
summerfeng
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集
shademoon
 
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
shademoon
 
Slide08 807007748
Slide08 807007748Slide08 807007748
Slide08 807007748
Shiyao Ma
 
10 檔案說明與處理
10 檔案說明與處理10 檔案說明與處理
10 檔案說明與處理
shademoon
 

Was ist angesagt? (19)

C程式-函式與巨集
C程式-函式與巨集C程式-函式與巨集
C程式-函式與巨集
 
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
 
C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能
 
08 指標
08 指標08 指標
08 指標
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗
 
Python變數與資料運算
Python變數與資料運算Python變數與資料運算
Python變數與資料運算
 
第3章算法与控制语句
第3章算法与控制语句第3章算法与控制语句
第3章算法与控制语句
 
系統程式 -- 第 12 章 系統軟體實作
系統程式 -- 第 12 章 系統軟體實作系統程式 -- 第 12 章 系統軟體實作
系統程式 -- 第 12 章 系統軟體實作
 
Python 迴圈作業
Python 迴圈作業Python 迴圈作業
Python 迴圈作業
 
第四章 串操作应用举例
第四章 串操作应用举例第四章 串操作应用举例
第四章 串操作应用举例
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集
 
Python程式設計 - 分支作業
Python程式設計 - 分支作業Python程式設計 - 分支作業
Python程式設計 - 分支作業
 
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
 
Python程式設計 - 串列資料應用
Python程式設計 - 串列資料應用 Python程式設計 - 串列資料應用
Python程式設計 - 串列資料應用
 
Python程式設計 - 迴圈作業
Python程式設計 - 迴圈作業Python程式設計 - 迴圈作業
Python程式設計 - 迴圈作業
 
Slide08 807007748
Slide08 807007748Slide08 807007748
Slide08 807007748
 
Ch07
Ch07Ch07
Ch07
 
Ch10 範例
Ch10 範例Ch10 範例
Ch10 範例
 
10 檔案說明與處理
10 檔案說明與處理10 檔案說明與處理
10 檔案說明與處理
 

Ähnlich wie 第6章指针

第8章结构体与共用体
第8章结构体与共用体第8章结构体与共用体
第8章结构体与共用体
summerfeng
 
第9章 transact sql程序设计
第9章   transact sql程序设计第9章   transact sql程序设计
第9章 transact sql程序设计
hanmo1988
 
C 02 c语言的基本数据类型与表达式
C 02 c语言的基本数据类型与表达式C 02 c语言的基本数据类型与表达式
C 02 c语言的基本数据类型与表达式
1138177709
 
第2章数据类型、运算符和表达式
第2章数据类型、运算符和表达式第2章数据类型、运算符和表达式
第2章数据类型、运算符和表达式
summerfeng
 

Ähnlich wie 第6章指针 (20)

Ch 6
Ch 6Ch 6
Ch 6
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
C語言結構與串列
C語言結構與串列 C語言結構與串列
C語言結構與串列
 
Arduino程式快速入門
Arduino程式快速入門Arduino程式快速入門
Arduino程式快速入門
 
Chapter 6 point (c)
Chapter 6 point (c)Chapter 6 point (c)
Chapter 6 point (c)
 
C語言標準輸出入函式
C語言標準輸出入函式C語言標準輸出入函式
C語言標準輸出入函式
 
第8章结构体与共用体
第8章结构体与共用体第8章结构体与共用体
第8章结构体与共用体
 
第9章 transact sql程序设计
第9章   transact sql程序设计第9章   transact sql程序设计
第9章 transact sql程序设计
 
Python学习笔记
Python学习笔记Python学习笔记
Python学习笔记
 
C 02 c语言的基本数据类型与表达式
C 02 c语言的基本数据类型与表达式C 02 c语言的基本数据类型与表达式
C 02 c语言的基本数据类型与表达式
 
Intro to C++ Basic
Intro to C++ BasicIntro to C++ Basic
Intro to C++ Basic
 
UNIT 11 一级指针——指针基本篇.ppt
UNIT 11 一级指针——指针基本篇.pptUNIT 11 一级指针——指针基本篇.ppt
UNIT 11 一级指针——指针基本篇.ppt
 
系統程式
系統程式系統程式
系統程式
 
第2章数据类型、运算符和表达式
第2章数据类型、运算符和表达式第2章数据类型、运算符和表达式
第2章数据类型、运算符和表达式
 
Ch9 教學
Ch9 教學Ch9 教學
Ch9 教學
 
Smart pointer
Smart pointerSmart pointer
Smart pointer
 
Ch9
Ch9Ch9
Ch9
 
Python 入門
Python 入門 Python 入門
Python 入門
 
Javascript Training
Javascript TrainingJavascript Training
Javascript Training
 
Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門
 

第6章指针

  • 2.
  • 3.
  • 4. 指针引入 除了上述 值型 数据, C 语言还能处理一类非常特殊的数据 — 内存地址 。 计算机内部有很多存储 单元, 每个存储单元 都用 唯一的 地址编号 ( 表示为一个整数 加以 相互区别 ) ,简称为 地址 。 在 C 语言中,存储地址也叫 指针
  • 5.
  • 6.
  • 8.
  • 9.
  • 10.
  • 11. 6.2.2 指针变量的引用 指针变量可以指向任何与之相一致的数据类型的变量, 没有赋值时, 指针变量的值是不确定的,从而不能确定它具体的指向, 只有 为其赋值,指 针 变量才有意义 对指针变量的引用形式为: * 指针变量 其含义是取出指针变量所指向内存单元中的值
  • 12. 6.2.2 指针变量的引用 [ 例 6.1] 用指针变量进行输入、输出。 int main( ){ int *p,m; scanf(&quot;%d&quot; , &m); /* & :取变量 m 的指针 */ p = &m; /* 指针 p 指向变量 m */ printf(&quot;%d &quot;,*p); /* *p 是对指针所指的变量的引 用形式 , 与 m 意义相同 */ printf(&quot;%x&quot;,p); /* 输出指针变量 p 中的指针,指 针是以整数形式表示的 */ return 0; }
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26. 6.4.1 指针与一维数组 例 int array[10]; int *p; p=&array[0]; //  p=array; 或 int *p=&array[0]; 或 int *p=array; 数组名是表示数组首地址的地址常量 array[0] array[1] array[2] array[3] array[9] ... 整型指针 p &array[0] p
  • 27.
  • 28.
  • 29.
  • 30.
  • 31. 表示形式 含义 地址 a 二维数组名 , 数组首地址 , 指向 一维数组 a[0] ,即第 0 行首地址 a[0],*(a+0),*a 第 0 行第 0 列元素地址 a+1, &a[1] 第 1 行首地址 a[1],*(a+1) 第 1 行第 0 列元素地址 a[1]+2,*(a+1)+2,&a[1][2] 第 1 行第 2 列元素地址 *(a[1]+2),*(*(a+1)+2), a[1][2] 第 1 行第 2 列元素值 4062196 4062196 4062212 4062212 4062220 元素值为 5
  • 32.
  • 33.
  • 34. 6.4.3 数组指针作函数的参数 实 参 形 参 数组名 数组名 数组名 指针变量 指针变量 数组名 指针变量 指针变量
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46. 6.5 指针的地址分配 printf(&quot;str1------------str2&quot;) ; printf(&quot;%s.......%s&quot;, ptr1,ptr2 ); strcpy(temp,ptr1); /* 串复制 */ strcpy(ptr1,ptr2); strcpy(ptr2,temp); printf(&quot;str1------------str2&quot;); printf(&quot;%s.......%s&quot;,ptr1,ptr2); free(ptr1); free(ptr2); free(temp); return 0; } 例 6-19 续 程序运行结果: 输入: input str1:Hello input str2:world 输出: str1------------str2 Hello.......world str1------------str2 world.......Hello
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65. 小结 定 义 含 义 int i; 定义整型变量 i int *p = &i; p 为指向整型数据 i 的指针变量 int a[n]; 定义含 n 个元素的整型数组 a ,此时 n 为常量 ( 下同 ) int *p[n]; n 个指向整型数据的指针变量组成的指针数组 p int (*p)[n]; p 为指向含 n 个元素的一维整型数组的指针变量 int f(); f 为返回整型数的函数 int *p(); p 为返回指针的函数,该指针指向一个整型数据 int (*p)(); p 为指向函数的指针变量,该函数返回整型数 int **p; p 为指针变量,它指向一个指向整型数据的指针变量

Hinweis der Redaktion

  1. #include &lt;stdio.h&gt; #define M 3 #define N 4 float average(float *p,int n) ; void tprint(float (*pt)[N]); int main( ){ float a[M][N],score[M]; float averscore = 0.0; int i,j; float (*ptr)[N]; /* 指向二维数组 a 的行指针 */ ptr = a; /* 行指针指向二维数组的第一行,即指向二维数组 */ for( i = 0; i &lt; M; i++ ) /* 二维数组的数据输入 */ for( j = 0; j &lt; N; j++ ) scanf( &amp;quot;%f&amp;quot;, &amp;a[i][j] ); for( i = 0; i &lt; M; i++ ){ score[i] = average(a[i],N); averscore += score[i]; } averscore /= M; /* 总成绩均值 */ ptr = a; for( i = 0; i &lt; M; i++ ) if ( score[i] &gt; averscore ) tprint(ptr+i); /* 打印指定序号的同学成绩 */ return 0; } float average(float *p,int n){ /* 计算总平均分数并打印 */ float aver=0,*pend=p+n; for(;p&lt;pend;p++) aver=aver+(*p); aver=aver/n; return aver; } void tprint(float (*pt)[N]){ /* 打印第 k 个学生的 N 门课程成绩 */ int i,j; for(j=0; j&lt;N; j++) printf(&amp;quot;%5.1f&amp;quot;,*(*pt+j)); printf(&amp;quot;\\n&amp;quot;); }
  2. #include &lt;stdio.h&gt; #include &lt;string.h&gt; #define maxStrlen 30 /* 串的最大长度 */ #define maxStrcount 50 /* 数组的最大行数 */ int alpha_first(char *list[], int min_sub, int max_sub); void select_sort_str(char *list[], int n); int main( ){ char string[maxStrcount][maxStrlen]; char *alpha[maxStrlen]; int num,i; char one_char; printf(&amp;quot; 输入串个数 (0 . . %d)\\n&gt; &amp;quot;, maxStrlen); scanf(&amp;quot;%d&amp;quot;, &amp;num); printf(&amp;quot; 每个符号串以 Enter 键结束 \\n&amp;quot;); for (i = 0; i &lt; num; ++i) gets(string[i]); /* 串的分隔符为 ‘ \\n’ */ for (i = 0; i &lt; num; ++i) alpha[i] = string[i]; /* 仅仅复制指针 */ select_sort_str(alpha, num); /* 选择排序 */ printf(&amp;quot;\\n\\n%-30s%5c%-30s\\n\\n&amp;quot;, &amp;quot; 初始顺序 &amp;quot;, &apos; &apos;, &amp;quot; 字典顺序 &amp;quot;); for (i = 0; i &lt; num; ++i) printf(&amp;quot;%-30s%5c%-30s\\n&amp;quot;, string[i], &apos; &apos;, alpha[i]); return(0); } int alpha_first(char *list[], int min_sub, int max_sub){ int first, i; first = min_sub; for (i = min_sub + 1; i &lt;= max_sub; ++i) if (strcmp(list[i], list[first]) &lt; 0) first = i; return (first); } void select_sort_str(char *list[],int n){ int fill,index_of_min; char *temp; for (fill = 0; fill &lt; n - 1; ++fill) { index_of_min = alpha_first(list, fill, n - 1); if (index_of_min != fill) { temp = list[index_of_min]; list[index_of_min] = list[fill]; list[fill] = temp; } } }
  3. #include &lt;string.h&gt; #include &lt;stdio.h&gt; #define N 4 void sort(char *name[],int n); char *binary(char *ptr[],char *str,int n); int main(){ char *pstr[N],*target; int i,j; for (i=0; i&lt;N; i++){ pstr[i]= (char *)malloc(20); gets(pstr[i]); } printf(&amp;quot;\\n&amp;quot;); printf(&amp;quot;original string:\\n&amp;quot;); for(i=0; i&lt;N; i++) printf(&amp;quot;%s\\n&amp;quot;,pstr[i]); sort(pstr,N); printf(&amp;quot;after sort string:\\n&amp;quot;); for(i=0; i&lt;N; i++) printf(&amp;quot;%s\\n&amp;quot;,pstr[i]); printf(&amp;quot;input search string:\\n&amp;quot;); target = (char *)malloc(20); while ( strcmp(gets(target),&amp;quot;End&amp;quot;) != 0 ){ target=binary(pstr,target,N); if (target) printf(&amp;quot;succesful-----%s\\n&amp;quot; ,target); else printf(&amp;quot;no succesful!\\n&amp;quot;); printf(&amp;quot;input search string:\\n&amp;quot;); target = (char *)malloc(20); } free(target); return 0; } void sort(char *name[],int n){ /* 选择法排序 */ char *temp; int i,j,k; for(i=0; i&lt;n-1; i++){ k=i; for(j=i+1; j&lt;n; j++) if(strcmp(name[j],name[k])&lt;0)k=j; if(k!=i){ temp=name[i];name[i]=name[k];name[k]=temp; } } } char *binary(char *ptr[],char *str,int n){ /* 折半查找 */ int hig,low,mid; low=0; hig=n-1; while(low&lt;=hig){ mid=(low+hig)/2; if(strcmp(str,ptr[mid])&lt;0) hig = mid - 1 ; else if(strcmp(str,ptr[mid])&gt;0) low = mid + 1 ; else return(str); } return NULL; }
  4. #include &lt;stdio.h&gt; int max(int ,int ); int min(int ,int ); int add(int ,int ); int process(int x,int y, int (*f)(int,int)); int main( ){ int a,b; printf(&amp;quot;Enter two num to a and b:&amp;quot;);scanf(&amp;quot;%d%d&amp;quot;,&amp;a,&amp;b); /* 调用通用处理函数 */ printf(&amp;quot;max=%d\\n&amp;quot;,process(a,b,max)); printf(&amp;quot;min=%d\\n&amp;quot;,process(a,b,min)); printf(&amp;quot;add=%d\\n&amp;quot;,process(a,b,add)); return 0; } int max(int x,int y){ /* 返回两数之中较大的数 */ return x&gt;y?x:y; } int min(int x,int y){/* 返回两数之中较小的数 */ return x&lt;y?x:y; } int add(int x,int y){ /* 返回两数的和 */ return x+y; } int process(int x,int y,int (*f)(int,int)){/* 函数参数为一个函数指针 */ return (*f)(x,y); }