태그 보관물: programming-practices

programming-practices

[] 연산자 대신 포인터 산술을 통해 배열 요소에 액세스하는 것을 참조하는 것이 좋지 않습니까? 위해 포인터를 전혀 만들지

방금 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이라고 자처합니다. 내 대답이 명확 해지기를 바랍니다!


답변