ko en ko ko ko ja en en zh en pt ko ko ru ko ko ko nl ko ko ko ko ko ko ko ko ko nl ko ko ko ko nl ko en ko en ko nl ko ko ko ko ko zh en en en en pt fr en en kn en sv fr en en en en en es fr en en en fr ja en en en en en en en en en fi en hu pt hbs_lat ru en en en en pl ko ko ko ko ko ko ko zh en en pt en en en uz en en fr eo sv en en en es en en en en en en ja en it hu ja eo en de en ko ko en en
[] 연산자 대신 포인터 산술을 통해 배열 요소에 액세스하는 것을 참조하는 것이 좋지 않습니까? 위해 포인터를 전혀 만들지 - How IT
방금 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이라고 자처합니다. 내 대답이 명확 해지기를 바랍니다!
이 글은 Software 카테고리에 분류되었고 c, programming-practices 태그가 있으며 소장 마님에 의해 2022-08-08에 작성되었습니다.
← DSLR은 P 모드에서 어떤 조리개를 선택해야하는지 어떻게 알 수 있습니까? 큰 영향을 미칩니다. 예를 들어, 의미없는 배경 편향-분산 분해 : 예측 된 제곱 예측 오차에 대한 항으로 돌이킬 수없는 오차 프로세스를 고려합니다 Y=f(X)+eY=f(X)+e Y = f(X) + \varepsilon 와 E(e)=0E(e)=0\mathbb{E}(\varepsilon)=0 →
CLI를 통해 WPA2- 엔터프라이즈 연결에 연결 (데스크탑 없음) 연결에 연결하는 데 필요한 설명을
dnsmasq 순환 루프 오류 어딘가에 구성이없는 것을
“연결 프로그램”목록을 제거 / 변경하려면 어떻게합니까? 하나를 제거하고
저는 관리자입니다. 업무 관계 및 프로그래머와의 의사 소통을 어떻게 개선 할 수 있습니까? [닫은] 5 년 동안 여러
오디오 입력은 항상 웹캠 마이크가 될 수 있습니까? 이동해야합니다. 거기에서 오디오 입력을 ” 웹캠
Proudly powered by WordPress