본문 바로가기

Language/C

C programming_ch1

출처 : 쉽게 풀어 쓴 C언어 express

ch0

- 언어 및 링크

- 함수 & 변수

- 연산자

- 연결

ch1

- 배열

- 포인터

ch2

- 문자와 문자열

- 구조체

- 동적메모리, 정적메모리

ch3

- 참고할 함수

 

 

배열

 

* 생성시 10으로 선언하지만 인덱스는 0번 부터 시작한다.

변수와 달리 배열은 사본이 아닌 원본으로 전달된다. 즉 변수는 다른 함수에서 적용시 다시 원 값으로 초기화 되지만 배열은 값이 변한다.

배열의 초기화는 {}로 차원에 맞추어서 초기화 해준다.

 

 

포인터

 

(주소와 매우 밀접한 연관을 가지고 있다.)

포인터란 주소를 가지고 있는 변수이다.

 

 

변수는 메모리에 저장된다. 메모리는 바이트 단위로 엑세스 된다. 첫번째 바이트의 주소는 0, 두번재 바이트는 1

바이트 단위는 char형이 가장 작은 사이즈 인데 이게 1바이트.

 

 

 

※ 변수의 주소와 다르다. 변수의 주소를 담은 변수로 선언이 된다. 즉 주소용 변수 이다.

포인터에 자료형이 붙는 이유 : 예를 들어 int *p라면 p는 정수를 저장하는 변수의 주소를 가지고 있다.

따라서 여기서 p=&c;는 안된다.

 

변수의 주소

 

 

& : 예를 들어 &i는 4부터 7까지의 바이트를 사용하지만 시작주소 4가 나온다. (&c는 8)

 

 

간접 참조 연산자

 

 

* : 포인터가 가리키는 값을 가져오는 연산자

주의

선언할 때의 *p와 사용할 때의 *p는 다르다.

포인터(변수를 저장하는 상자의 주소를 저장하는 변수 즉 주소)가 가르키는 값 -> 그 주소에 있는 변수(값)

따라서 답은 4가 아니라 10이다.

 

 

#include <stdio.h>

int main(void)
{
	int i = 3000;
    int *p = NULL;
    
    p = &i;
    
    printf("i = %d\n", i);		// 변수의 값 출력
    printf("&i = %u\n\n", &i);	// 변수의 주소 출력
    
    printf("p = %u\n", p);		// 포인터의 값 출력
    printf("*p = %d\n", *p);
    
    return 0;
    
   }
   
   
   /* 실행결과
   i = 3000
   &i = 1245024
   
   p = 1245024
   *p = 3000
   */

간접참조를 해서 i의 내용을 변화시킬 수 있지만 p도 (주소를 담은) 변수니까 주소가 있다.

따라서 그 p(주소)의 값을 변화시킬 때 포인터가 어떤 자료형을 담고 있는지에 따라 p(주소값)의 변화량은 다르다.

 

인수 전달 방법

 

함수 호출 시에 인수 전달 방법

 

값에 의한 호출(call by value)

 - 함수로 복사본이 전달된다.

 - 기본적인 방법

 

참조에 의한 방법(call by referernce)

 - 함수로 원본이 전달된다.

 - C에서는 포인터를 이용하여 흉내 낼 수 있다.

 

//call by value
#include <stdio.b>
void swap(int x, int y);	//function declaration

int main(void)
{
	int a = 100, b= 200;
    printf("a=%d b=%d\n", a, b);
    
    swap(a, b);
    
    printf("a=%d b=%d\n", a, b);
    return 0;
}

void swap(int x, int y)
{
	int tmp;
    printf("x=%d y=%d\n", x, y);
    
    tmp = x;
    x = y;
    y = tmp;
    
    printf("x=%d y=%d\n", x, y);
    
}
/*
a=100 b=200
x=100 y=200
x=200 y=100
a=100 b=200
*/

//call by reference
#include <stdio.b>
void swap(int x, int y);	//function declaration

int main(void)
{
	int a = 100, b= 200;
    printf("a=%d b=%d\n", a, b);
    
    swap(&a, &b);
    
    printf("a=%d b=%d\n", a, b);
    return 0;
} 

void swap(int *px, int *py)				// *
{
	int tmp;
    
    tmp = *px;
    *px = *py;
    *py = tmp;
    
}
/*
a=100 b=200
a=200 b=100
*/

포인터와 배열

 

배열과 포인터는 아주 밀접한 관계를 가지고 있다.

배열 이름이 바로 포인터이다.

포인터는 배열처럼 사용이 가능하다.

인덱스 표기법을 포인터에 사용할 수 있다.

 

// a = 1245008 --> 인덱스 표기법이다.

 

배열 매개 변수

 

배열 매개 변수는 포인터로 생각할 수 있다.

 

'Language > C' 카테고리의 다른 글

C programming_ch2  (0) 2022.03.22
C programming_ch0  (0) 2022.03.21