[정수리] 함수 전달 부정확한 매개 변수 이해 - c 언어
1468 단어 C 언어
Typedef char *va_list;/* <stdatg.h> */
#define va_start(ap,p) (ap=(char*)(&(p)+1))
#define va_arg(ap,type) ((type*)(ap+=sizeof(type)))[-1]
#defien va_end(ap)
/* */
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
void fun(char *s, ... ) /* ... */
{
va_list ap;
int t; /* main() a,b,c */
va_start(ap,s);
printf("%s",s);
while((t=va_arg(ap,int)))
printf("%d",t);
va_end(ap);
}
main()
{
int a=1,b=2,c=3;
fun('test:",a,b,c,NULL);/* NULL */
printf("
");
}
내부 매크로 정의 설명 1, #define vastart(ap,p) (ap=(char*)(&(p)+1))
매개 변수 ap:fun 함수 참조 가져오기...의 첫 번째 요소 주소;
2、#define va_arg(ap,type) ((type*)(ap+=sizeof(type)))[-1]
매개 변수 ap: 다음 매개 변수 요소 주소로 이동하기;
1), ap는 문자 포인터이고 모든 ap+1은 한 주소를 아래로 이동한다는 뜻이다. [한 주소가 8자리 (한 문자) 저장되어 있기 때문이다].
2), ap+=sizeof(type): 상응하는 위치를 더욱 유형적으로 이동한다는 뜻이다.[type이 int형이면 ap 뒤로 4개의 주소로 이동!]
3), (type*)(지침 주소)[-1]: 전체적인 의미는 ap의 이전 주소 위치로 돌아가는 것이다.
(type*)(포인터 주소): ap의 다음 포인터 주소를 가리키며 (type*)형으로 강등;
(포인터 주소) [-1]: 포인터 주소 유형에 따라 한 위치를 뒤로 이동합니다.[type이 int라면 4개의 주소를 앞으로 이동합니다.]
[참고:
1), 한 주소에 8자리를 보관한다.
2) 포인터가 이동하는 위치는 포인터 유형에 따라 이동한다.
char*p가 있으면 이동은 주소가 1개입니다.만약char**p라면 이동은 4개의 주소(char** 바늘 32비트 저장)입니다.만약 int * p라면 이동도 4개의 주소입니다 (int *도 바늘 주소입니다).
#defien va_end(ap)
끝나다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.