C语言 浅谈可变参数
生活随笔
收集整理的這篇文章主要介紹了
C语言 浅谈可变参数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.可變參數(shù)產(chǎn)生原因
首先來看一個(gè)簡單的例子。
int Add(int x, int y) {return x + y; } int main() {int sum = 0;sum = Add(1, 2);//sum = Add(1, 2, 3);//sum = Add(1);system("pause");return 0; }我們可以看到,對(duì)于這個(gè)代碼只可以計(jì)算兩個(gè)數(shù)的加法。
這樣我們引入一個(gè)新的知識(shí)點(diǎn)!
可變參數(shù)實(shí)現(xiàn)求任意數(shù)的和
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdarg.h> #include <stdlib.h>int Add(int num, ...) {int sum = 0;va_list arg;va_start(arg, num);for (int i = 0; i < num; i++){sum += va_arg(arg, int);}va_end(arg);return sum; } int main() {printf("%d\n", Add(4, 2, 3, 4, 5));system("pause");return 0; }詳解
1.main()函數(shù)第一句
printf("%d\n", Add(4, 2, 3, 4, 5));第一個(gè)4表示元素個(gè)數(shù)剩余表示元素內(nèi)容
2.
操作符的含義:
1.
va_list arg;| va_list | char * | va_list arg 創(chuàng)建一個(gè)字符指針arg,用于訪問參數(shù)列表的未確定部分。 |
2.
va_start(arg, num);(ap=(va_list)&v + _INTSIZEOF(v))
| va_start (ap,v) | (ap=(va_list)&v + _INTSIZEOF(v)) | 初始化變量arg ,va_start有兩個(gè)參數(shù),它的第一個(gè)參數(shù)是va_list所創(chuàng)建的字符指針。第2個(gè)參數(shù)是“…”之前的那個(gè)參數(shù);(不可以讀省略號(hào)) |
| va_start (arg,num) | (arg=(char *)&v + _INTSIZEOF(num)) | |
| _INTSIZEOF | (sizeof(n) + sizeof(int)-1 & ~(sizeof(int)-1) | 跳過num,來到位置參數(shù)的第一個(gè)參數(shù)。向上取四的整數(shù)倍 |
3.
for (int i = 0; i < num; i++){sum += va_arg(arg, int);}| va_arg(ap,t) | (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t))) | (*(t*)((arg += _INTSIZEOF(int)) - _INTSIZEOF(int))) |
| (*(t*)((arg += _INTSIZEOF(int)) - _INTSIZEOF(int))) | (*(int *)((arg += 4) - 4)) | |
| (arg += 4) - 4) | arg; arg+=4; | 先給arg加4再減,arg這次產(chǎn)生的結(jié)果沒變,但是arg指向了下一個(gè)位置。一個(gè)代碼做了兩個(gè)動(dòng)作 |
取出所有未知參數(shù),然后加給sum
| va_end(ap) | (ap = (va_list)0) | 給指針賦值空指針。不用的時(shí)候釋放 |
防止指針亂指用完一定要釋放。
總結(jié)
以上是生活随笔為你收集整理的C语言 浅谈可变参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言随机数生成超详解
- 下一篇: C语言模拟实现标准库函数之strlen(