[정수리] 함수 전달 부정확한 매개 변수 이해 - 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)
끝나다

좋은 웹페이지 즐겨찾기