return 0는 int main(void){} 라는 메인 함수가 int형으로 반환할 것을 약속해놓았기 때문에
main의 return값으로 0을 줘서 프로그램을 종료함을 의미한다.
sizeof()는 변수가 메모리에서 차지하는 공간을 출력해준다.
overflow 특정변수가 커버할 수 있는 범위를 넘었을 때 생기는 오류
double x = pow( 지수 ,거듭제곱 횟수)
c언어에서의 반복문 사용시, 먼저 변수 선언을 한 뒤에 반복문을 사용해줘야 함.
for(int i =0; n<i; i++) 이렇게 안에서 선언을 지원하지 않음.
전역변수는 main 밖에서 선언해서 사용.
이런식으로 함수 원형 선언없이, 그냥 사용자 정의 함수만 선언해서 main에 함수명();만 추가해서 사용 가능.
재귀함수
자기 안에 자기가 또 들어가 있는 함수(print()함수 안에 print()가 있음을 확인할 수 있다.)
C언어에서의 기본 배열 선언
배열
a[0]의 주소값이 포인터 변수a 안에 저장되는 것.
단, 배열의 이름인 a가 포인터 변수인것은 맞지만, 주소를 가리키는 곳의 값은 변경 불가.
배열의 활용.
배열을 매개변수로 받을 때는 배열모양이 아닌, 포인터로도 받을 수 있음.
포인터 arithmetic
배열에 1을 더하면 +1이 증가하는게 아닌,+4씩 증가.
(int형은 4씩, char은 1씩 증가, long 8씩 등 자료형의 크기에 따라서 증가.)
p 변수만을 출력하면 주소값 그 자체를. *p 변수를 출력하면 그 주소값이 가리킨 곳을 출력.
실제로는 포인터 변수인 배열의 이름 a가 a[0]의 주소값만 저장해서 배열과 연결되어 있음.
a[0]을 발판 삼아 [] 안의 숫자가 1씩 늘면 주소값 4씩 늘면서 공간을 찾아가는 것.
a[i+1] , a[i+2] ..... 쭉 증가될 때마다 주소값을 4씩 바꾸고 있는 것이고 a[5] 이런식으로 불러내면
a[0+5] 즉, a[0]을 기준으로 5만큼... 총 5x4 =20 만큼 주소를 옮겨서 그 공간의 실제값을 주고 있는 거임.
2차원 배열
포인터(pointer)란 메모리의 주소값을 저장하는 변수(공간)
포인터 처음 배울 때 많이 헷갈렸지만, 변수가 '공간'이라는 의미만 기억한다면 크게 헷갈리는 일이 없다.(개인적 생각)
*x라는 x라 불리는 공간이 있는데 거긴 어떤 곳의 주소값을 저장 중이란 의미.
*x = *y 는 x라는 주소를 담기 위한 공간에, y라는 어떤곳의 주소를 담는 공간이 지닌 주소값을 *x 값으로 한다는 의미.
y안의 어떤 곳의 주소값을 x가 먹어버리는 거.
그 어떤 곳의 주소값을 먹게 되면 사실상 그 어떤 곳에 있는 값을 지니게 되는 것. (공간을 차지했으니 그 안의 값은 x꺼)
포인터 없으면 x,y값이 그대로
포인터를 쓰면 값이 바뀜.
왜 그럴까?
swap 함수의 매개변수인 x,y값은 main의 값을 빌려오는 x,y일 뿐임.
main의 x,y와 swap의 x,y값은 같지만 서로 다른 변수(공간)임을 인지해야함.
swap의 함수 스택이 끝나게 되면 자동적으로, swap 안의 x, y공간은 사라지는 거임.
하지만 포인터 x,y매개변수를 가진 swap 함수는 main의 x,y가 저장된 곳에 직접 접근해서 주소를 서로 바꿔버리기 때문에,
swap 함수가 끝나도 남아있을 수 있게 됨.
아래의 또 다른 예시처럼 전역변수를 통해서 counter 함수의 변수들은 counter안에서만 노는 매개변수 없이, 전역변수(공간)에서 놀기 때문에 counter안의 변화는 곧 전역 변수의 변화. 그러니 main에서도 먹혀드는 것.
코드가 길어지면 전역변수로 했다간, 유지보수에 애를 크게 먹기 때문에 매개변수 사용이 더 잦은 편이다.
*p는 p라는 공간에 우선 어딘가의 주소값을 넣어야지만 쓸수 있는 공간이됨
(포인터는 다른 변수를 제어하는 특별한 공간인데, 제어권이 없으면 선언한 의미가 없기에 쓸 수 없음)
'p = &변수' 를 통해서 어떤 변수(공간)의 주소를 줘서 연결을 해야지만, *p, p라는 변수(공간)를 쓸 수 있음
일단 연결하면 주소는 연결됬으니 값을 집어넣으면 그 변수 값의 제어권을 가진 공간으로 쓴다보면됨.
- int * ip : 이런식으로 첫 포인터의 등장은 주소값을 저장한다고 선언.
- y = *ip : 일반문장에서 포인터 변수가 오른쪽에 등장할 때, 그 주소가 가리키는 공간 그 자체나, 그 주소의 값을 의미
- *ip = 0 : 포인터 변수가 왼쪽에 등장할 때, 저장하고 있는 주소값이 가리키는 곳의 값을 가리킴. 그곳의 값을 0으로 바꿈.(주소를 0으로 바꾸는게 아님.)
'📈알고리즘 > 알고리즘' 카테고리의 다른 글
C언어 공부(3)[동적 메모리 할당] (0) | 2023.02.08 |
---|---|
C언어 자료구조[함수 포인터] (0) | 2023.02.07 |
C언어 공부(2)[문자열 제어, 구조체] (0) | 2023.02.07 |
C언어 기초정리(입력, 출력, 함수구조) (0) | 2023.02.06 |
다시 공부하는 c언어 (0) | 2023.02.06 |