방금 C로 프로그래밍을 배우고 포인터와 배열에 대한 이해를 높이기 위해 포인터를 전혀 만들지 않고 배열의 요소를 참조하려고했습니다.
for(k1 = 0; k1 < ROW; k1++){
for(k2 = 0; k2 < COLUMN; k2++){
array[k1][k2] = k1*COLUMN + k2 + 1;
printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2));
}
}
전체 코드는 완벽하게 컴파일되고 실행됩니다.
큰 소스 코드에서 모든 단일 배열에 대한 포인터를 작성하는 것이 매우 비효율적 인 것 같습니다.
따라서 포인터를 사용하여 배열의 주소를 저장하고 검색하는 대신 위에 표시된 것처럼 배열의 주소를 직접 사용하는 것은 좋지 않은 프로그래밍 방법입니까?
답변
읽기 어려운 정도까지만 “나쁜”것입니다. a[x]
와 동일 *(a+x)
하므로 효율성이나 동작에 차이가 없습니다 (사실 x[a]
작동합니다). 그것은 a[x]
보통 우리 인간에게 훨씬 더 직관적입니다.
그러나 가독성이 중요하지 않다는 것은 아닙니다. 이 두 표현식을 코드에서 본다면 어떻게 “읽을”것인지 생각하십시오.
*(a+x)
= “포인터a
와 정수 의 합이 가리키는 것x
“a[x]
= ”x
배열의 일원a
“
마찬가지로 배열 요소의 주소를 참조해야 할 경우 :
(a+x)
= “포인터a
와 정수 의 합x
“&a[x]
= ”x
배열 의 th 멤버 주소a
“
대부분의 경우 []
여러 배열 (특히 배열 배열)에서 작동하는 사소한 코드를 볼 때 버전을 이해하기가 더 쉽습니다. 이것이 []
운영자가 처음에 존재하는 이유 입니다.
추신 : 학습 연습으로 이런 종류의 일을하는 것은 매우 좋은 생각입니다. 배열은 실제로 포인터와 오프셋이라는 것을 이해하는 것이 중요합니다.
답변
예, 나쁜 습관이지만 비효율적 인 이유는 아닙니다.
배열 연산자는 후드 아래에서 포인터 산술을 사용하므로 동일하게 효율적입니다.
포인터 산술 문제는 오류가 발생하기 쉽고 읽기가 어렵다는 것입니다.
경험 법칙 : 필요하지 않은 경우 포인터 산술을 사용하지 마십시오.
답변
당신의 학습 c를 식히십시오, 당신은 단지 작은 혀 꼬임 중 하나를 발견했습니다. 배열에서 포인터 산술을 수행하지 않고 포인터 배열을 수행하고 있습니다. 배열에서 포인터 산술을 수행 할 수 없습니다. 배열은 포인터로 붕괴하지만 포인터 자체는 아닙니다. 내가 가진 것은 (cmaster의 코멘트 참조)
int *array[]; //This is a array to pointers of type *int.
array[k1] + k2; //This is pointer arithmetic on one pointer stored in the array
이 포인터를 역 참조하면 방금 계산 한 포인터가 가리키는 값이 제공됩니다. 당신이하고있는 일을하는 데는 일반적으로 아무런 의미가 없습니다. 그러나 배열을 선형화 한 다음 이와 같은 보폭을 만들 수 있습니다.
int array[y_dim*x_dim];
int index = x_dim*y + x;
array[index]; //Gives you the element in x, y!
그녀가 x_dim이라고 자처합니다. 내 대답이 명확 해지기를 바랍니다!