目錄
- 一.前言
- 二.函式不定長引數簡介
- 1.va_start
- 2.va_arg
- 3.va_end
- 三.自定義不定長引數的函式
- 1.va_start/va_arg/va_end 案例一
- 2.va_start/va_arg/va_end 案例二
- 四.猜你喜歡
零基礎 Python 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門
一.前言
對 printf 函式的使用,我們并不陌生,首先我們來看看下面關于 printf 函式的幾種呼叫方式:
printf("hello world");
printf("%s","hello world");
printf("%s %s","hello world","C語言教程-猿說編程");
printf("%d",3);
printf("%d %d",3,6);
printf("%d %d %d ",1,2,3);
靈魂拷問:
- 1.printf 函式到底引數是什么型別?
- 2.printf 函式到底有幾個引數?
二.函式不定長引數簡介
關于 C 語言的不定長引數使用,必然離不開三個宏:va_start、va_arg、va_end
#include <stdarg.h>
#define va_start __crt_va_start
#define va_arg __crt_va_arg
#define va_end __crt_va_end
1.va_start
#include <stdarg.h>//必須包含頭檔案
/*
* arg_ptr 指向函式引數串列中的第一個可選引數
* argN 是位于第一個可選引數之前的固定引數, 或者說最后一個固定引數
*/
va_start(arg_ptr, argN)
2.va_arg
#include <stdarg.h>//必須包含頭檔案
/*
* 回傳引數串列中指標arg_ptr所指的引數, 回傳型別為type.
* 并使指標arg_ptr指向引數串列中下一個引數.
* 回傳的是可選引數, 不包括固定引數.
*/
va_arg(arg_ptr, type)
3.va_end
#include <stdarg.h>//必須包含頭檔案
/*
* 清空引數串列, 并置引數指標arg_ptr無效.
*/
va_end(arg_ptr)
三.自定義不定長引數的函式
1.va_start/va_arg/va_end 案例一
/************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言 函式不定長引數
//@Time:2021/06/23 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/************************************************************************/
#include <stdio.h>
#include <stdarg.h>
void WriteFrmtd(char *format, ...)
{
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
}
int main ()
{
WriteFrmtd("%d variable argument\n", 1);
WriteFrmtd("%d variable %s\n", 2, "arguments");
return(0);
}
輸出:
1 variable argument
2 variable arguments
2.va_start/va_arg/va_end 案例二
/************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言 函式不定長引數
//@Time:2021/06/23 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/************************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include <stdarg.h>
//c引數型別,引數個數不確定,
//自定義方法
int Sum(int Num, ...)
{
int S = 0, T;
va_list ap;
va_start(ap, Num);
for (int i = 0; i<Num; ++i)
{
T = va_arg(ap, int); S += T;
}
return S;
}
void myPrintf(int Num, ...)
{
va_list ap;
va_start(ap, Num);
for (int i = 0; i<Num; i++)
{
//va_arg 回傳值是不固定引數,所以第一個值是"dsdsdss"并非2
char *T = va_arg(ap, char*);
printf("myPrintf:%s\n", T);
}
}
int main()
{
int n;
myPrintf(2, "dsdsdss", "sdaddd");
printf("%d\n", Sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
return 0;
}
輸出:
myPrintf:dsdsdss
myPrintf:sdaddd
55
*/
四.猜你喜歡
- C 語言邏輯運算子
- C 語言三目運算子
- C 語言逗號運算式
- C 語言 sizeof 和 strlen 函式區別
- C 語言 strcpy 和 strcpy_s 函式區別
- C 語言 memcpy 和 memcpy_s 區別
- C 語言 陣列定義和使用
- C 語言 陣列遍歷
- C 語言 陣列下標越界
- C 語言 陣列記憶體溢位
- C 語言 陣列下標越界和記憶體溢位區別
- C 語言 二維陣列定義和使用
- C 語言 二維陣列行數和列數計算
- C 語言 指標宣告和定義
- C 語言 指標 p++ / p–
- C 語言 p++/§++/_(p++)/_p++
- C 語言 使用指標遍歷陣列
- C 語言 指標和陣列區別
- C 語言 陣列指標
- C 語言 指標陣列
- C 語言 指標陣列和陣列指標區別
- C 語言 空指標 NULL
- C 語言 void 指標
- C 語言 野指標
- C 語言 函式宣告和定義
- C 語言 函式宣告和呼叫
- C 語言 函式值傳遞和址傳遞
- C 語言 函式預設引數
- C 語言 函式不定長引數
未經允許不得轉載:猿說編程 ? C 語言 函式不定長引數
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/296059.html
標籤:其他
