2012-02-28 2 views
0

I 함수에서 다음 코드가있는 경우 :액세스

int A[5][5]; 
    int i; int j; 
    for(i=0;i<5;i++){ 
    for(j=0;j<5;j++){ 
     A[i][j]=i+j; 
     printf("%d\n", A[i][j]); 
    } 
    } 

이것은 단순히 각 인덱스의 합을 출력한다. 내가 알고 싶은 것은 동적 배열과 비슷한 방식으로 정적 배열의 각 인덱스에 액세스 할 수 있는지 여부입니다. 그래서 예를 들어, 나는 액세스하기를 원한다면 A [2] [2], 내가 말할 수 있습니다

*(A+(2*5+2)*sizeof(int))? 

내가 정적으로 할당 행렬에 약간의 행렬 연산을 수행 할 내가 역 참조 동적 행렬에 사용되는 방법 같은 느낌 제 목적을 위해 최선을 다할 것입니다. 어떤 아이디어? 고맙습니다.

+1

귀하가 주장하는대로 그 배열은 정적이지 않습니다. –

+0

참조 해제 될 포인터가 int에 대한 포인터 인 경우 sizeof()에 의한 곱셈은 필요하지 않습니다. 포인터가 가리키는 유형의 크기만큼 포인터를 계산합니다. – dmckee

+1

@dmckee 불필요 할뿐만 아니라 잘못되었습니다. 첫째, 그가 기대하는 바를하지 않을 것입니다. 둘째, 배열의 경계를 넘어 가서 정의되지 않은 동작을 할 수 있습니다. –

답변

4

이렇게하는 방법은 A[i][j]입니다.

인덱스의 합계를으로 설정했기 때문에 인덱스의 합계가 인쇄됩니다. A[i][j] = i+j.

+0

저는 OP가 포인터 산술을 사용하여 요소에 액세스하는 방법을 묻고 있다고 생각합니다. 데이터 액세스 방식에 대한 것보다는 데이터 할당 방식에 대한 질문이 더 많습니다. –

+0

@AdamLiss는 색인의 합계를 얻고 있다고 혼란 스러울 수 있습니다. –

+1

@ LuchianGrigore : "각 색인의 합계를 인쇄합니다."라는 문장을 읽는 방법과 조금 다릅니다. "문제는 배열 요소를 출력하기로되어 있지만 인덱스의 합계를 출력한다는 것입니다." "이것은 단순히 의미있는 것을 보여주기위한 코드 일 뿐이며 인덱스의 합계로 설정된 배열 요소를 출력합니다." – ruakh

1

당신은 사용할 수 있습니다 A[2][2]에 대한

*(*(A + 2) + 2) 

합니다. 포인터 연산은 char 단위가 아닌 뾰족한 단위로 이루어집니다.

물론, 선호하는 방법은 A[2][2]을 프로그램에 사용하는 것입니다.

+0

그냥'A [2] [2]'에 무슨 문제가 있습니까? –

+0

@LuchianGrigore 나는 OP가 명시 적 포인터 연산으로'A [2] [2]'의 동등성을 요구했다고 생각했습니다. – ouah

+0

@LuchianGrigore'A [2] [2]'잘못 없습니다. 그러나 그는 포인터 값을 사용하여'A' 요소에 접근하는 방법을 요구하고 있습니다. –

0

첨자 동작 a[i]*(a + i)로서 정의된다 - 당신은이 a에서 i 요소 (하지 바이트)의 오프셋하고 그 결과를 역 참조 계산한다. 배열이 연속으로 할당되어있는 경우

a[i][j] == *(a[i] + j) == *(*(a + i) + j) 

, 당신은 또한 단지 *(a + i * rows + j)를 작성할 수 : 2 차원 배열의 경우, 당신은 재귀 적으로 그 정의를 적용한다.

포인터 연산을 수행 할 때 기본 유형의 크기가 고려됩니다. 포인터

T *p; 

에게 p + 1psizeof T 바이트 유형 T의 다음 객체의 주소로 평가하는 표현식을 감안할 때.

포인터 연산을 사용하면 아래 첨자 연산자를 사용하는 것보다 빠르지 않을 수도 있습니다 (두 버전을 모두 코드화하고 프로파일 러를 통해 실행하여 확실하게 수행하십시오). 은 분명히입니다.

0

포인터 연산이 까다로울 수 있습니다. 올바른 길을 가고 있지만 포인터와 정상 산술 사이에는 약간의 차이가 있습니다.당신은 포인터 연산을 볼 수 있듯이 당신이이 같이 보일 것 볼 것 출력을 볼 실행하는 경우 예를 들어,이 코드를

int I = 0; 
float F = 0; 
double D = 0; 
int* PI = 0; 
float* PF = 0; 
double* PD = 0; 

cout<<I<<" "<<F<<" "<<D<<" "<<PI<<" "<<PF<<" "<<PD<<endl; 
I++;F++;D++;PI++;PF++,PD++; 

cout<<I<<" "<<F<<" "<<D<<" "<<PI<<" "<<PF<<" "<<PD<<endl; 
cout<<I<<" "<<F<<" "<<D<<" "<<(int)PI<<" "<<(int)PF<<" "<<(int)PD<<endl; 

을 고려

0 0 0 0 0 0 
1 1 1 0x4 0x4 0x8 
1 1 1 4 4 8 

(아키텍처와 컴파일러에 따라 다름)을 가리키는 변수의 유형에 따라 이 처리됩니다.

포인터 연산을 사용하여 액세스 할 때 어떤 유형의 변수를 사용하는지 염두에 두십시오. 예를 위하여도이 코드를 고려 그냥 위해

:

void* V = 0; 

int* IV = (int*)V; 
float* FV = (float*)V; 
double* DV = (double*)V; 

IV++;FV++;DV++; 
cout<<IV<<" "<<FV<<" "<<DV<<endl; 

당신은 출력을 얻을 것이다 (다시 아키텍처와 컴파일러에 따라)

0x4 0x4 0x8 

코드 조각은 위의 것을 기억하십시오 데모 목적으로 만 사용하십시오. 많은 것들이 있습니다 여기에서을 사용하지 마십시오.