- C語言程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策語句
- C語言 - 決策語句
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - NULL 指標
- C語言 - void 指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近、遠和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉(或 enum)
- C語言 - 結構體填充和壓縮
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - Typedef
- C語言中的檔案處理
- C語言 - 輸入與輸出
- C語言 - 檔案I/O(檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C語言程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言函式中返回指標
在C語言程式設計中,一個函式可以定義為有多個引數,但它只能向呼叫函式返回一個表示式。
一個函式可以返回單個值,該值可以是任何型別的變數,例如基本型別(如int、float、char等)、指向基本型別或使用者定義型別變數的指標,或者指向任何變數的指標。
閱讀本章,瞭解C程式中函式返回指標的不同方法。
從C語言函式中返回靜態陣列
如果函式具有區域性變數或區域性陣列,則返回區域性變數的指標是不可接受的,因為它指向一個不再存在的變數。請注意,區域性變數一旦函式作用域結束就將不復存在。
示例1
下面的示例演示瞭如何在被呼叫函式(arrfunction)內使用靜態陣列並將它的指標返回給main()函式。
#include <stdio.h>
#include <math.h>
float * arrfunction(int);
int main(){
int x = 100, i;
float *arr = arrfunction(x);
printf("Square of %d: %f\n", x, *arr);
printf("Cube of %d: %f\n", x, arr[1]);
printf("Square root of %d: %f\n", x, arr[2]);
return 0;
}
float *arrfunction(int x){
static float arr[3];
arr[0] = pow(x,2);
arr[1] = pow(x, 3);
arr[2] = pow(x, 0.5);
return arr;
}
輸出
執行此程式碼時,將產生以下輸出:
Square of 100: 10000.000000 Cube of 100: 1000000.000000 Square root of 100: 10.000000
示例2
現在考慮以下函式,它將生成10個隨機數。它們儲存在一個靜態陣列中,並將它們的指標返回給main()函式。然後,在main()函式中遍歷該陣列,如下所示:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
/* function to generate and return random numbers */
int *getRandom() {
static int r[10];
srand((unsigned)time(NULL)); /* set the seed */
for(int i = 0; i < 10; ++i){
r[i] = rand();
}
return r;
}
int main(){
int *p; /* a pointer to an int */
p = getRandom();
for(int i = 0; i < 10; i++) {
printf("*(p + %d): %d\n", i, *(p + i));
}
return 0;
}
輸出
執行程式碼並檢查其輸出:
*(p + 0): 776161014 *(p + 1): 80783871 *(p + 2): 135562290 *(p + 3): 697080154 *(p + 4): 2064569097 *(p + 5): 1933176747 *(p + 6): 653917193 *(p + 7): 2142653666 *(p + 8): 1257588074 *(p + 9): 1257936184
從C語言函式中返回字串
使用相同的方法,您可以將字串傳遞給函式並從函式返回字串。C語言中的字串是char型別的陣列。在下面的示例中,我們使用指標傳遞字串,在函式中操作它,然後將其返回給main()函式。
示例
在被呼叫函式中,我們使用malloc()函式分配記憶體。傳遞的字串在返回之前與區域性字串連線。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *hellomsg(char *);
int main(){
char *name = "TutorialsPoint";
char *arr = hellomsg(name);
printf("%s\n", arr);
return 0;
}
char *hellomsg(char *x){
char *arr = (char *)malloc(50*sizeof(char));
strcpy(arr, "Hello ");
strcat(arr, x);
return arr;
}
輸出
執行程式碼並檢查其輸出:
Hello TutorialsPoint
從C語言函式中返回結構體指標
下面的示例演示瞭如何返回struct型別變數的指標。
這裡,area()函式有兩個按值傳遞的引數。main()函式從使用者讀取長度和寬度,並將它們傳遞給area()函式,area()函式填充一個struct變數並將它的引用(指標)返回給main()函式。
示例
檢視程式:
#include <stdio.h>
#include <string.h>
struct rectangle{
float len, brd;
double area;
};
struct rectangle * area(float x, float y);
int main(){
struct rectangle *r;
float x, y;
x = 10.5, y = 20.5;
r = area(x, y);
printf("Length: %f \nBreadth: %f \nArea: %lf\n", r->len, r->brd, r->area);
return 0;
}
struct rectangle * area(float x, float y){
double area = (double)(x*y);
static struct rectangle r;
r.len = x; r.brd = y; r.area = area;
return &r;
}
輸出
執行此程式碼時,將產生以下輸出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
廣告