const int * ptr  = #

                                             >>>>>>>>  const int * const ptr = #

int * const ptr = # 


위와 같이 두 가지 선언을 동시에 할 수 있다.


WRITTEN BY
CIP_Pooh

,
1
2
3
4
5
6
int main(void)
{
    int num;
    scanf("%d" , &num);
 
}



scanf 함수 내에서 외부에 선언된 변수 num에 접근 하기 위해서는 num의 주소 값을 


알아야 한다. 그래서 scanf 함수는 변수의 주소 값을 요구한다.


1
2
3
4
5
6
int main(void)
{
    char str[10];
    scanf("%s" , str);
 
}



위 코드와 같이 배열 이름 str앞에 & 연산자를 붙이지 않는 이유는


str은 배열의 이름이고 그 자체가 주소 값이기 때문에 & 연산자를 붙이지 않는다.


str을 전달함은 scanf 함수 내부로 배열 str 주소 값을 전달하는 것이다.


WRITTEN BY
CIP_Pooh

,

int * param = int param[]


둘은 같은 선언이다.


WRITTEN BY
CIP_Pooh

,

Call-by-value 란?


- 함수를 호출할 때 단순히 값을 전달하는 형태의 함수호출을 말한다.

- 함수 외부에 선언된 변수에 접근이 불가능하다.


EX)


1
2
3
4
5
void callbyvalue (int num)
{
    if(num<=0)
        return;
}





Call-by-reference 란?


- 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수호출을 말한다.

- 외부에 선언된 변수에 접근이 가능하다.


EX)


1
2
3
4
5
6
7
void callbyreference (int * param, int n)
{
    int i;
    for(i=0; i<n; i++)
        printf("%d ", param[i]);
    printf("\n");
}






WRITTEN BY
CIP_Pooh

,
1
2
3
4
5
6
7
8
9
10
11
12
int sample(int num)
 
int main(void)
{
    int num = 10;
    sample(10);
 
    - - - - - - - 
}
 
 
 



위에 보이는 코드와 같이 , 배열을 함수의 인자로  전달하려면 배열을 통채로 복사할 


수 있도록 배열이 매개변수에 선언되어야 한다.


But C언어에서는 매개변수로 배열의 선언을 허용하지 않는다.



WRITTEN BY
CIP_Pooh

,

1. 주소값을 변수에 저장하지 않고 포인터 변수라는 것을 선언해서 저장 하는 이유?

  - 변수에는 내가 가리키는 메모리에 대한 정보가 없다.

  - 포인터에는 내가 가리키는 메모리에 대한 정보가 있다.

 

2. type에 따라 그 type에 맞는 포인터 변수를 선언해서 저장해야 되는 이유?

  - 해당 type을 가리킨다는 정보가 해당 type 포인터 (ex) int *)이기 때문이다.

 

(출처 : 윤성우의 열혈 C 프로그래밍 중에서..)

 

 


WRITTEN BY
CIP_Pooh

,