이 거의 모든 사람이 다
char ** a;
다음
a
에 대한 혼동됩니다 한 가지 유의 하나 개 이상의 문자를 하나 이상의 포인터에 대한 포인터입니다. 메모리에 어딘가에 포인터가 있고 각 포인터는 문자열을 가리 킵니다 (말하자면). a
은이 포인터 중 첫 번째 포인터를 나타냅니다. (a+1)
은 두 번째 것을 말합니다. 문자 블록은 메모리의 어딘가에 있지만 반드시 서로 가깝지는 않습니다.
for (int i = 0 ; i < 10 ; ++i) {
a++ = malloc(100);
}
또는 당신이 할 수 있습니다 : :이 작업을 수행 할 수
char *b = malloc(1000);
for (int i = 0 ; i < 10 ; ++i) {
a++ = b;
b += 100;
}
을 그리고 당신은 100 자 각 10 포인터와 배열에 채워 것입니다. (음, 정말 100 개 문자에 대한 공간을 우리는 아직 문자를 입력하지 않았기 때문에.)
여기
char* a[];
다시, a
문자의 무리의 첫 번째 포인터의 무리입니다. 실제로는 char ** a
과 같지만 재사용 할 경우 더 합리적입니다.
for (int i = 0 ; i < 10 ; ++i) {
a[i] = malloc(100);
}
위와 동일한 작업을 수행하지만 주어진 문자 블록으로 돌아가는 것이 더 쉬워집니다. 예를 들어, 우리는 이것은 같은 길이의 블록으로 분할 할 수있는 문자의 무리에 대한 포인터 인 것을 약간 다릅니다 strcpy(a[4], "Bob was here");
char a[][];
할 수 있습니다. 스택에 할당하기에는 너무 큰 경우가 아니라면 일반적으로이 경우 크기를 지정합니다. char a[10][100]
은 1,000 개의 문자 스폿을 100 개의 10 개의 그룹으로 나누어 메모리에 할당합니다.
예제 {"0a","0b","0c"};
은 세 개의 메모리 블록을 할당하는 방법입니다. 각각 3 바이트 길이이며 미리 입력이 문자로 (그리고 닫는 \ 0 문자
당신은 몇 가지 힌트를 얻을 수 있습니다 (HTTP ://c-faq.com/decl/spiral.anderson.html). –
@ JoachimPileborg : 가치있는 링크! – deepmax
@MM. 많은 고급 선언에 유용하지만이 경우에는 완벽하지 않을 수 있습니다. 예를 들어'char * v [K] [L];'선언은 첫 번째 라운드에서 포인터를 건너 뛰고 두 번째 배열로 직접 이동해야한다는 것은 분명하지 않습니다. –