[C언어] 배열 표현 하기

    주소 표현식

    * 을 통해서 표현한다.

    에스터리스크(*) 를 구분할 때는 값인지, 주소 인지부터 파악하는게 우선 순위다.

    1. 주소와 값을 구분하는 방법
    1-1. 선언할 것을 기준으로 [], * 갯수가 부족하면 => address
    1-2. 선언한 것을 기준으로 [], * 갯수가 동일하면 => value

    2. 주소가 어디를 표기하는지 구분 하는 방법
    2-1. [] , * 1개 부족 : 1차원 주소
    2-2. [] , * 2개 부족 : 2차원 주소


    ★★★
    3. 주소 연산 (위, 1번과 2번을 기준으로 3번을 구분 한다.)

    부족한 갯수
    1차원 주소 + 1 => 한 요소의 사이즈.
    2차원 주소 + 1 => 한 행의 사이즈
    3차원 주소 + 1 => 한 면의 사이즈.




    4.  첨자( [] )와 에스터리스크의 관계

    []  <=>  *
    배열과 에스터리스크는 서로 다르다.
    그러나 서로 주소값을 가졌으므로 호환이 가능하다.

    ex
    void abc ( int aa[2])
    {

    }

    여기서 매게변수 int aa[2]는 배열이 아니라, 포인터다.
    포인터는 배열의 역할도 수행하고 있어서 바로 error가 발생하지는 않는다.
    단, 배열처럼 인식하고 사용할 경우 메모리 부족을 겪으므로 조심해야 한다.



    ==============================================================
    복습하기

    배열 int a[4] = {4, 3, ,2, 1};

    a[0] = &a[0]

    => a라고 사용해도 배열의 첫번째이므로 a[0]을 인식 할 수 있다.


    이랬을 때 위의 조건 3번, a를 기준으로 1개가 부족하므로 +1을 하게 될 경우 다음 요소를 가르킨다.


    a = a[0]
    a+1 = a[1] 
    a+2 = a[2]



    이미 *의 갯수가 있으므로, *a+1을 하게 될 경우 (값+1) 적용 된다.

    *a = a[0]
    *(a+1) = a[1]
    *(a+2) = a[2]

     

     

    #include<stdio.h>
    
    int main() {
    	char name[10];			//이름
    	int score[4] = { 0 };	//국어 영어, 수학, 총점
    	float avg = 0.f;
    
    	int i, j;
    
    	// input
    	scanf("%s", &name);	//name
    
    	//점수를 4개를 받는다.
    	for (i = 0; i < 3; i++) {
    		//scanf("%d", &score[i]);
    		scanf("%d", &*(score + i));
    			
    		//총점
    		//score[3] += score[i];
    		*(score+3) += *(score + i);
    	}
    	////연산
    	//score[3] = score[0] + score[1] + score[2];
    
    	//평균
    	//avg = score[3] / 3.f;
    	avg = *(score + 3) / 3.f;
    
    
    	// 출력
    	// c 언어에서는 항상 주소값이 필요하다.
    	// 마지막에 항상 null 문자가 들어간다. 그래서 null이 인식이 되면 자동으로 끊긴다.
    	printf("%s\t", name);
    
    	for (i = 0; i < 4; i++)
    		//점수 출력
    		//printf("%d\t", score[i]);
    		printf("%d\t", *(score + i));
    
    	//평균 출력
    	printf("%f\n", avg);
    }

    천천히 배열을 포인터로 변경 시켰다.

     

     

     

    2차원 배열 주소 표현하기

    기준 a[0][0] a[0][1] a[1][0] a[1][1] 사용 여부
    a[0][0] a[0][0] a[0][0]+1 a[0][0]+2 a[0][0]+3  
    a a   a+1    
    a[0] a[0] a[0]+1 a[0]+2 a[0]+3 x
    a[1]     a[1] a[1]+1  
    *a *a *a+1 *a+2 *a+3 x
          *(a+1) *(a+1)+1  

     

    2차원 배열 값 표현하기

    기준 a[0][0] a[0][1] a[1][0] a[1][1] 사용 여부
    a[0][0] a[0][0] a[0][0]+1 a[0][0]+2 a[0][0]+3  
    *a *a   *(a+1)    
    a[0] *(a[0]) *(a[0]+1) *(a[0]+2) *(a[0]+3) x
    a[1]     *a[1] *(a[1]+1)  
    **a *(*a) *(*a+1) *(*a+2) *(*a+3) x
          **(a+1) *(*(a+1)+1)  

     

     

     

    3차원 배열 주소 나타내기

      a[0][0][0] a[0][0][1] a[0][1][0] a[0][1][1] a[1][0][0] a[1][0][1] a[1][1][0] a[1][1][1]
    a[0][0] a[0][0] a[0][1] a[0][1]+1 a[0][1]+1 a[1][0] a[1][0]+1 a[1][1] a[1][1]+1
    a[0] a[0] x a[0]+1 x a[1] x a[1]+1 x
    a a              
    *a *a x *a+1 x *(a+1) x *(a+1)+1 x
    *a[0] *a[0] *a[0]+1 *(a[0]+1) *(a[0]+1)+1 *a[1] *a[1]+1 *(a[1]+1) *(a[1]+1)+1
    **a **a ***a+1 *(*a+1) *(*a+1)+1 **(a+1) **(a+1)+1 *(*(a+1)+1) *(*(a+1)+1)+1

    결과값은 앞에 * 하나 더 추가해주면 된다.

     

     

     

    배열을 에스터리스크로 변형해보자

    #include<stdio.h>
    
    int main() {
    	char name[3][10];			//이름
    	int score[3][4] = { 0 };	//국어 영어, 수학, 총점
    	float avg[3] = { 0.f };
    
    	int i, j;
    
    	//3명이 되었으므로 for 추가
    	for (j = 0; j < 3; j++) {
    
    		// input
    		//scanf("%s", &name[j]);	//name
    		scanf("%s", *(name+j));	//name
    
    		//점수를 4개를 받는다.
    		for (i = 0; i < 3; i++) {
    			//scanf("%d", &score[j][i])
    			scanf("%d", *(score+j)+i)
    				;
    			//총점
    			//score[j][3] += score[j][i];
    			*(*(score + j) + 3) += *(*(score + j) + i);
    		}
    		////연산
    		//score[3] = score[0] + score[1] + score[2];
    
    		//평균
    		//avg[j] = score[j][3] / 3.f;
    		*(avg+j) = *(*(score+j)+3) / 3.f;
    	}
    
    	// 출력
    	// c 언어에서는 항상 주소값이 필요하다.
    	// 마지막에 항상 null 문자가 들어간다. 그래서 null이 인식이 되면 자동으로 끊긴다.
    	for (j = 0; j < 3; j++) {
    		//printf("%s\t", name[j]);
    		printf("%s\t", *(name+j));
    
    		for (i = 0; i < 4; i++)
    			//점수 출력
    			//printf("%d\t", score[j][i]);
    			printf("%d\t", *(*(score+j)+i));
    
    		//평균 출력
    		//printf("%f\n", avg[j]);
    		printf("%f\n", *(avg+j));
    	}
    
    }

    반응형

    댓글

    Designed by JB FACTORY