C语言程序设计 细节总结(第8章 指针)
第8章 指針
8.1 指針變量
1.指針變量定義及賦值:int a; int *p=&a; 或 int a; int *p; p=&a;
2.指針運算符:(1)取地址運算符& (2)取內容運算符* (結合性均為右至左)
3.指針加1,不是純加1,而是加一個所指變量的字節個數
4.指針變量作為函數參數,例,交換函數swap():
#include<stdio.h>
void swap1(int *p1,int *p2) //交換地址中的值
{int t; //p1,p2中存的是a和b的地址,將p1和p2地址中的內容交換,即p1中a地址中值變為b,p2中b地址中值變為at=*p1;*p1=*p2;*p2=t;
}
void swap2(int *p1,int *p2) //交換形參指針指向的地址,無法返回給主函數p1,p2
{int *t; //交換后p1指向b地址,p2指向a地址,僅形參指向改變,不影響實參t=p1;p1=p2;p2=t;
}
int main()
{int a,b;int *p1,*p2;p1=&a;p2=&b;while(~scanf("%d%d",p1,p2)){printf("a=%d,b=%d\n",a,b);printf("p1=%d,p2=%d\n",p1,p2);swap1(p1,p2);printf("交換值結果:\n");printf("a=%d,b=%d\n",a,b);printf("p1=%d,p2=%d\n",p1,p2);/*swap2(p1,p2);printf("交換地址測試結果:\n");printf("a=%d,b=%d\n",a,b);printf("p1=%d,p2=%d\n",p1,p2);*/}return 0;
}
8.2 指向數組的指針
8.2.1指向一維數組的指針
1.定義及賦值:int a[5],*p; p=&a[0]; 或p=a;
2.引用數組元素
(1)地址表示法:a[i]的地址:p+3、a+3、&a[i]
(2)數組元素表示法:a[i]的訪問:*(p+3)、*(a+3)、a[i]
(3)指針變量加下標:指針變量可以加下標:p[i]
(4)指針變量與數組名的引用區別:數組名表示數組首地址,屬于常量,p為指向數值a的指針變量,p++可以,a++不可以
(5)例,逆序輸出10個數
#include<stdio.h>
int main()
{int i,n,*p,a[10];p=a;while(~scanf("%d",&n)){for(i=0; i<n; i++){scanf("%d",&a[i]);}for(i=n-1; i>=0; i--) //下標法訪問數組{printf("%d ",a[i]);}printf("\n");for(i=n-1; i>=0; i--) //數組名訪問數組{printf("%d ",*(a+i));}printf("\n");for(i=n-1; i>=0; i--) //指針變量訪問變量(1){printf("%d ",*(p+i));}printf("\n");for(p=a+n-1; p>=a; p--) //指針變量訪問變量(2){printf("%d ",*p);}printf("\n");}return 0;
}
8.2.2指向多維數組的指針
int s[3][4];
1.行轉列:s+0、s+1、s+2是每一行的首地址,進行的是行操作,若想利用s對行中各元素操作,必須將行操作方式轉為列操作方式。轉換方式*(s+i)(i=0,1,2)
2.二維數組的指針表示形式:
(1)數組首地址:s
(2)i行首地址:s+i = &s[i]
(3)i行j列元素地址:s[i]+j = *(s+i)+j = &s[i][j]
(4)i行j列元素:*(s[i]+j) = *(*(s+i)+j) = s[i][j]
3.指向多維數組的指針:
(1)指向數組元素的指針變量 int p=s[0];
(2)指向由m個元素組成的一維數組的指針變量:int (*p)[4]; p=s;
例:
#include<stdio.h>
int main()
{int s[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//(1)用指向數組元素的指針變量輸出數組元素int *p1;for(p1=s[0]; p1<s[0]+12; p1++){if((p1-s[0])%4==0){printf("\n");}printf("%d ",*p1);}printf("\n");//(2)用指向一維數組的指針變量輸出任一行任一列的元素int i,j;int (*p2)[4];p2=s;scanf("%d%d",&i,&j);printf("%d\n",*(*(p2+i)+j));return 0;
}
8.3 指向字符串的指針
1.可以不定義字符數組,直接定義指向字符串的指針變量,利用指針變量操作字符串,如:
char *str = “I’m a student”; printf(“%s\n”,str);
8.4 指向函數的指針
1.定義指向函數的指針變量格式:數據類型(*指針變量名)();
2.賦值格式:指針變量名=函數名;
3.調用格式:(*指針變量名)(實參表)
例:
//輸入5個數,求最大值
#include<stdio.h>
int max(int *p)
{int i;int m=p[0];for(i=1; i<5; i++){if(*(p+i)>m) m=*(p+i);}return m;
}
int main()
{int i,m,a[5];int (*f)(int *p); //定義指向函數的指針變量ffor(i=0; i<5; i++){scanf("%d",&a[i]);}f=max; //將函數max入口地址賦值給fm=(*f)(a); //利用指針變量f調用函數printf("%d\n",m);return 0;
}
4.指向函數的指針做函數參數
5.返回指針值的函數
8.5 指向指針的指針
總結
以上是生活随笔為你收集整理的C语言程序设计 细节总结(第8章 指针)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑换个硬盘要多少钱
- 下一篇: C语言程序设计 细节总结(第9章 结构体