출처 : 쉽게 풀어 쓴 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 |