2차원 배열의 선언


int arr1[2][3]//행이 2, 열이 3인 2차원배열

int arr2[3][3]=

{

{1,2,3},

{4,5,6},

{7,8,9}

}; // 2차원배열 선언과 동시에 초기화

int arr3[][4] ={1,2,3,4,5,6,7,8}; //선언과 동시에 초기화한다면, 행의길이를 생략하고 초기화할 수 있다.


3차원 배열의 선언


int arr1[2][3][4]; //높이2,세로3,가로4인 int 형 3차원배열이다.  3행4열의 int형 2차원배열이 2개 겹쳐있는것으로 이해하자.

'C언어 > 열혈C' 카테고리의 다른 글

C : Chapter -15 다차원 배열과 포인터  (0) 2018.03.25
C : Chapter -14 이중 포인터  (0) 2018.03.23
C : Chapter -12 포인터와 함수  (0) 2018.03.22
C : Chapter -11 포인터와 배열  (0) 2018.03.22
C : Chapter-10 포인터  (0) 2018.03.22

함수 호출시 전달되는 인자의 값은 매개변수에 복사가된다.

int SimpleFunc(int num) { ... }

int main(void)

{

int age =17;

SimpleFunc(age); // age 에 저장된 값이 매개변수 num 에 복사된다.

}


따라서 SimpleFunc 함수에서 num의 값을 변경했다고 하더라도 age 값의 변화는 없다.


배열을 함수의 인자로 전달하는 방식


매개변수로 배열을 선언할 수 없기 때문에 , 함수내에서 배열에 접근하기위해선 배열의 주소값을 전달해야한다.


void ShowArrayElem1 ( int * param , int len) { ...} // 함수 내에선 배열의 길이를 계산할 수 없기때문에 , 배열의 길이정보도 함께 인자로 전달해야한다.

void ShowArrayElem2 { int[] param , int len) {....}

둘은 매개변수의 선언에서는 같은 변수의 선언이다.


Call-by-value , Call-by-reference


을 전달하는 형태의 함수 호출 : call-by -value // 값을 복사하기때문에 매개변수에 전달된 값을 변경할 수 없다.

주소값을 전달하는 형태의 함수호출 : call-by-reference // 주소값을 전달하기때문에 전달된 값을 변경할 수 있다.


포인터 대상의 const 선언


const int * ptr = # // 포인터 변수 ptr 을 이용해서 ptr 이 가리키는 변수에 저장된 값을 변경하는 것을 허용하지 않는다

int * const ptr = # // 포인터 변수 ptr 은 상수이며 , 따라서 ptr은 num 을 제외한 다른 주소값을 가리킬 수없다 ( 주소값을 변경할 수 없다 )

const 선언을 많이 할수록 코드의 안정성은 높아진다. 따라서 바꾸지 않을 변수는 const 선언을 해주는것이 좋다.



'C언어 > 열혈C' 카테고리의 다른 글

C : Chapter -14 이중 포인터  (0) 2018.03.23
C : Chapter -13 다차원 배열  (0) 2018.03.23
C : Chapter -11 포인터와 배열  (0) 2018.03.22
C : Chapter-10 포인터  (0) 2018.03.22
C : Chapter-9 배열  (0) 2018.03.22

포인터와 배열의 관계


배열의 이름은 주소값을 바꿀수 없는 상수형태의 포인터이다. 따라서 ,배열의 이름을 피 연산자로 하는 * 연산이 가능하다. 1차원 배열 이름의 포인터형은 배열의 이름이 가리키는 대상을 기준으로 결정하면 된다.


ex)

int arr1 [3] ={1,2,3};

double arr2 [3] = {1.1 ,2.2 , 3.3};

printf(" %d %g ", *arr1,*arr2); // 1, 1.1 출력


포인터를 배열의 이름처럼 사용 할수있다


int arr[3]

*ptr = arr;

ptr[2] = 2;


포인터를 대상으로하는 증가및 감소연산


int * ptr1 =&num1;

double * ptr2  = &num2;

ptr1 += 1; // ptr1 의 주소값은 4바이트 증가 ( 가리키는 자료형이 int )

ptr2 += 1; // ptr2 의 주소값은 8바이트 증가 ( 가리키는 자료형이 double )

* TYPE형 포인터를 대상으로 n 크기만큼 값을 증가 감소시 n x sizeof(TYPE)의 크기만큼 주소값이 증가 및 감소한다.

이를통해 arr[i] == *(arr+i) 이다. 


두가지 형태의 문자열 표현


char str1[] = "My String"; // 배열의 길이는 자동으로 계산된다. 

이는 배열을 기반으로하는 변수 형태의 문자열 선언이다 . 변수형태이기 때문에 , 문자열의 일부를 변경할 수 있다. 하지만 str1 은 다른 주소값을 가질 수 없다.

char * str2 = "Your String"; 

이는 포인터를 기반으로하는 상수형태의 문자열이다 .따라서 그 내용의 변경이 불가능하다. 하지만 str2 는 다른주소값을 가질 수 있다.


포인터 배열


포인터 변수로 이루어져 주소값의 저장이 가능한 배열을 가리켜 포인터 배열이라고 한다.

int * arr[2] = {&num1,&num2}; // 길이가 2인 int 형 포인터 배열 arr


문자열을 저장하는 포인터 배열

char * arr[3]={"Simple","String","Array"}; // 큰따옴표로 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후 그 주소값이 반환된다.

'C언어 > 열혈C' 카테고리의 다른 글

C : Chapter -13 다차원 배열  (0) 2018.03.23
C : Chapter -12 포인터와 함수  (0) 2018.03.22
C : Chapter-10 포인터  (0) 2018.03.22
C : Chapter-9 배열  (0) 2018.03.22
C : Chapter -8 함수  (0) 2018.03.19

+ Recent posts