Computer Language/C

[더블포인터, main 명령행 인자] 포인터의 포인터 그리고 main()의 명령행 인자.

Ohjeonghak 2013. 12. 21. 12:54
반응형

더블포인터

 

포인터의 포인터는 다루는 대상체가 포인터인 포인터 변수를 뜻한다.

ex)    char **pptr;

 

포인터의 포인터 변수도 일종의 변수이므로 초기화가 무엇보다도 중요하다.

ex)        int one, *two, **three;

one = 1;

two = &one;

three = &two;

 

char = *pstr[3], **ppstr;

ppstr = pstr;            //배열은 주소값을 의미함으로 &를 붙일 필요 없다.

ppstr = &pstr[0]       //&를 붙인다면 배열의 첫번째 주소값을 해주면 위와 동일해진다.

 

 

 

여기서 three 는 포인터의 포인터 변수이므로 위와 같이 주소 값을 저장 할 수 있다.

만약 앞에 &를 붙인 &three 이면 포인터의 포인터 변수(three)의 할당된 메모리 주소를 뜻한다.

*three는 three 변수가 가리키는 것을 참조 하라는 말이므로 위의 예로 보면 two의 주소값을 말한다.

**three는 three 변수가 가리키는 것을 참조 하고 다시 참조 하라는 말이므로 one에 저장된 1이된다.

 

여기서 배열과 포인터의 관계(http://kuroikuma.tistory.com/69) 포스팅에서 언급했던 것을 다시 복습 할 수 있다.

다시 위의 상황을 참고하여 예를 들면 아래의 수식은 모두 같은 의미이다.

 

*(*ppstr + 1) == *(*(ppstr + 0) + 1) == ppstr[0][1]

 

-주의 사항.

*pstr[3] 은 포인터 배열 이다. 따라서 pstr 자체는 배열명이다. "배열명은 주소를 뜻한다." 라는 말을 잊지 말도록 하자, 배열은 상수이지 절대 변수가 아니기 때문에 "pstr++"와 같은 연산은 절대 안된다.

하지만 **ppstr은 더블포인터 변수이기 때문에 상수가 아니다. 따라서 "ppstr++"와 같은 연산이 허용된다.

 

 

 

main()함수의 명령행 인자

프로그램을 실행할때 단순한 실행이 아닌 사용자의 입력값 또는 시스템 환경값을 받아와서 실행 되야 하는 경우가 있다.

이런 경우 main() 에 명령 인자를 사용한다.

 

메인 함수의 원형은 다음과 같다.

int main(int argc, char **argv, char **env)

 

- argc

argc는 명령행 인자의 개수를 뜻한다.

예를 들어 어떤 a.exe 라는 프로그램 실행파일이 있다면 이 프로그램에 명령어 인자로 숫자 2개를 주어 실행 할때 cmd 에서  a.exe 3 4  이렇게 할 수 있다. 여기서 명령행 인자의 총 갯수는 a.exe, 3, 4 이렇게 3개이다. 즉 첫번째 명령행 인자는 프로그램 실행파일이 된다.

 

- **argv

**argv 는 명령행 인자로 어떤 입력을 받았는지 알 수 있는 더블 포인터 변수이다.

문자열들이 1차원적으로 배열되어 있을 때 요긴하게 사용 할 수 있다.

a.exe 3 4 이렇게 프로그램을 실행했다면 각각의 값은 **argv에 아래와 같이 저장 되어 있다.

argv[0]    //a.exe

argv[1]    //3

argv[2]    //4

포인터 변수이기 때문에 아래와 같이 표기 할 수 있다.

*(argv + 0)    //a.exe

*(argv + 1)    //3

*(argv + 2)    //4

 

- **env

**env는 현재 시스템에 설정되어 있는 환경을 출력해준다.

예로 다음과 같이 소스를 짜고 출력해보면 시스템에 설정되어 있는 환경 값을 출력해서 확인 할 수 있다.

이걸로 이 시스템이 어떤 시스템인지 알고 작동 할 수 있기도 하다.

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char **argv, char **env)
{
	for(; *env; env++)
    	puts(*env);
        system("PAUSE");
}
반응형

'Computer Language > C' 카테고리의 다른 글

const *(포인터) 사용법  (0) 2015.05.08
alloc의 3가지 종류와 2차원 배열 동적할당  (0) 2013.12.27
배열과 포인터배열의 관계  (0) 2013.12.19
포인터의 기초  (0) 2013.10.23