C 언어에서 "char * A []"와 "char ** A"의 차이점은 무엇입니까?


대답 1:

char * a []는 char 유형 변수에 대한 포인터 배열이며, char ** a는 char 유형 변수의 포인터 변수에 대한 포인터를 정의합니다.

예를 들어

char c = 'a'; // c의 값 = 2

char * p = & c;

// 포인터 p는 c 변수를 가리 킵니다.

char ** pp = & p;

// pp는 변수 c를 가리키는 포인터 p를 가리 킵니다.

자세한 정보는 다음 URL을 참조하십시오 : http : //www.thegeekstuff.com/2012 ...


대답 2:

char * A []는 배열이고 char ** A는 포인터입니다. C에서 배열과 포인터는 종종 상호 교환 가능하지만 몇 가지 차이점이 있습니다.

1. "char * A []"를 사용하면 A에 값을 할당 할 수 없지만 A [x]에만 지정할 수 있습니다.

"char ** A"를 사용하면 A 및 A [x]에도 값을 할당 할 수 있습니다.

2. "char * A []"를 사용하면 배열 (예 : char * A [] = { "foo", "bar"};)을 초기화하고 sizeof (A)를 사용하여 크기를 가져올 수 있습니다 (64 비트). machine, 위의 예는 16 자입니다. 두 문자의 배열이기 때문입니다. *);

"char ** A"를 사용하면 sizeof (A)는 항상 포인터의 크기를 반환합니다 (64 비트 시스템에서는 8).


대답 3:
  1. char * A []는 "문자에 대한 포인터의 배열"을 의미하고 char ** A는 "문자에 대한 포인터에 대한 포인터"를 의미합니다. 첫 번째 것은 우리가 배열로 작업하고 있음을 명시 적으로 알려주고 두 번째는 그런 보장을하지 않습니다. 그러나 배열에 의해 배열이 해당 배열의 첫 번째 요소에 대한 포인터로 저장되기 때문에 구성 상 둘 다 C와 같습니다. 포인터 배열은 포인터에 대한 포인터의 특수 인스턴스입니다. 포인터에 대한 포인터가 반드시 포인터 배열 일 필요는 없습니다. 이를 설명하기 위해 포인터 배열 arrp의 경우 char ** A = (char **) (void *) arrp를 지정할 수 있지만 컴파일러 오류가 발생하지는 않습니다. char * A [] = ( char * []) ​​(void * []) ​​arrp; 실제로 길이 인수를주지 않고 인스턴스화하고 배열 할 수 없으며 포인터 만 배열로 캐스트 할 수 없습니다

대답 4:

첫 번째는 첫 번째 요소 (일명 배열)에 대한 포인터 [1]이고 두 번째는 문자열 배열 [2]에 대한 포인터 유형일 수 있습니다.

다시 말해서 배열은 어쨌든 포인터로 붕괴되고 따라서 구문 구문 설탕 (배열의 경우 크기 할당 요청을 간과하는 한)

[1] int *와 달리 char *는 범용 포인터 유형입니다.

[1] 문자열은 null로 끝나는 배열 자체로 전달됩니다.

더 많은 예를 보려면

Ken Gregg의 대답 C 주 프로그램에서 argv-에 이중 포인터를 언제 인수로 정의해야합니까?

C에서 배열 배열이 가능합니까?에 대한 Sergey Zubkov의 대답

C에서 배열 배열이 가능합니까?에 대한 John L. Miller의 대답