指標系統學習7-返回指標值的函式
1.返回指標值的函式
一個函式可以帶回一個整型值、字元值、實型值等,也可以帶回指標型的資料,即地址。其概念與以前類似,只是帶回的值的型別是指標型別而已。
這種帶回指標值的函式,一般定義形式為
型別名 *函式名(引數表列);
例如:
int *a(int x,int y);
例題:有若干個學生的成績(每個學生有4門課程),要求在使用者輸入學生序號以後,能輸出該學生的全部成績。用指標函式來實現。
#include <stdio.h> void main() {View Codedouble score[][4] = {{60.0, 70.0, 80.5, 90.5}, {56.0, 89.0, 67.0, 88.0}, {34.2, 78.5, 90.5, 66.0}}; double *search(double(*pointer)[4], int n); double *p; int i, m; printf("Please enter the number of student: "); scanf("%d", &m); printf("The scores of No.%d are: \n", m); p= search(score, m); for( i=0; i < 4; i++) { printf("%5.2f\t", *(p + i)); } printf("\n\n\n"); } double *search(double (*pointer)[4], int n) { double *pt; pt = *(pointer + n); return pt; }
2.指標函式和函式指標的區別
這兩個概念都是簡稱:
指標函式是指帶指標的函式,即本質是一個函式。
函式指標是指向函式的指標變數,因而函式指標本身首先應是指標變數,只不過該指標變數指向函式。
3.指標陣列和指向指標的指標
指標陣列的概念:一個數組,若其元素均為指標型別資料,稱為指標陣列,也就是說,指標陣列中的每一個元素都相當於一個指標變數。
一維指標陣列的定義形式為:型別名 陣列名[陣列長度];
例如: int *name[4];
從例項來認識:
#include <stdio.h> void main() { int a[5] = {1, 3, 5, 7, 9}; int *name[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]}; int i; for( i=0; i < 5; i++ ) { printf("%d ", *name[i]); } printf("\n\n"); }
例題:
將下邊字串按字母順序(由小到大)輸出。char *name[]={"Fishc.com", "www.fishc.com", "home.fishc.com","fuck you!","Thank you!"};
提示:
一,我們可以宣告一個數組指標來指向;
二,將排序利用strcmp()函式來解決;
三,各個功能抽象為函式或檔案。
字串在記憶體中:
我們可以宣告陣列指標:
#include <stdio.h> #include <string.h> void main() { void sort(char *name[], int n); void print(char *name[], int n); char *name[] = {"Fishc.com", "www.fishc.com", "home.fishc.com", "Fishc.com/dz"}; int n = 4; 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(name[k], name[j]) > 0 ) { k = j; } if( k != i ) { temp = name[i]; name[i] = name[k]; name[k] = temp; } } } } void print(char *name[], int n) { int i; for( i=0; i < n; i++ ) { printf("%s\n", name[i]); } }View Code
4.指向指標的指標
怎樣定義一個指向指標資料的指標變數呢? 形式可以如: char **p;
p的前面有兩個*號。*運算子的結合性是從右到左,因此**p相當於*(*p),顯然*p是指標變數的定義形式。如果沒有最前面的*,那就是定義了一個指向字元資料的指標變數。
現在它前面又有一個*號,表示指標變數p是指向一個字元指標變數的。*p就是p所指向的另一個指標變數。
從例項來認識:
#include <stdio.h> void main() { char *name[] = {"Fishc.com", "www.fishc.com", "home.fishc.com", "Fishc.com/dz"}; char **p; int i; for( i=0; i < 4; i++ ) { p = name + i; printf("%s\n", **p); } }
5.指標陣列作main函式的形參
指標陣列的一個重要應用是作為main函式的形參。在以往的程式中,main函式的第一行一般寫成以下形式:void main()
括弧中是空的。實際上,main函式可以有引數。例如:void main(int argc,char *argv[ ])
argc和argv就是main函式的形參。main函式是由作業系統呼叫的。那麼,main函式的形參的值從何處得到呢?
顯然不可能在程式中得到。實際上實參是和命令一起給出的。也就是在一個命令列中包括命令名和需要傳給main函式的引數。
命令列的一般形式為: 命令名 引數1 引數2……引數n
從例項來認識:
#include <stdio.h> #include <stdlib.h> void main (int argc, char *argv[]) { int i; printf ("the number of string is : %d\n", argc-1); for(i=1; i < argc; i++) { printf ("the string %d is : %s\n", i, argv[i]); } }
執行方式(執行生成的exe檔案):