더블포인터
포인터의 포인터는 다루는 대상체가 포인터인 포인터 변수를 뜻한다.
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 |