일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 십진법
- Sentiment Analysis
- half adder
- 모두의네트워크
- Tautology
- GPT-1
- 진리표
- 이진법 십진법 변환
- Circuit
- Logical statement
- dnf
- Gate
- Contradiction
- statement equivalence
- 모두의네트워크정리
- relationaldatabaseschema
- Binary notation
- CNF
- 명제 동치
- 써킷
- Decimal notation
- 항진명제
- ermodel
- 모순명제
- full adder
- 모두의네트워크요약
- truth table
- 명제
- Digital Logic Circuits
- cnn
- Today
- Total
NLP Learner in Switzerland
내가 이해하려고 쓰는 [포인터] Pointer 본문
* 유투버 동빈나님의 영상을 참조하여 정리한 것입니다.
이전에 배웠듯이 ampersand(&)는 해당 변수값이 들어있는 곳의 주소(address)이다.
포인터pointer를 나타내는 연산자는 asterisk(*)로 표기한다.
포인터를 간단하게 이해해보자.
int x = 70;
int *y = &x;
라고 선언했다고 가정한다.
그러면 x는 70이라는 값이고, y는 x의 주소를 가진다(e.g. 00AA00BB). 즉, y=&x이다.
그러면 *y는 뭘까? *y = 70이 된다. 즉, *y=x이다.
y=&x, *y=x 아하....??? well... ㅈㄴ헷갈린다... ㅡㅡ
뭐 일단은 *y=x니까,
x나 *y값을 바꾸게 되면 해당 변수값이 바뀐다.
그 예시를 보자.
#include <stdio.h>
int main(){
int i=10; (i값은 10)
int *p;
p = &i; (p가 i의 주소를 가리킨다)
printf("i=%d\n", i); (i값으로 10이 출력된다)
*p = 20; (p포인터를 20으로 변경하면)
printf("i=%d\n", i); (i값으로 20이 출력된다.
}
처음에 i의 값을 10으로 선언해주고, p라는 변수가 i의 주소를 가리키도록 설정했다.
이 상태에서 i를 출력해보면 그대로 10이 나오는데,
p포인터를 20으로 변경하면 i값이 20으로 바뀐다. 즉, 아래의 결과물이 도출된다.
p값이 i의 주소를 가리키고(p=&i) 있으므로 *p=i가 되기 때문이다. 따라서 *p값을 20으로 변경하면 i가 바뀐다.
정리해서 한마디로 쓰면, p=&i, *p=i이다.
좀 더 복잡한 예시를 보자. 아래의 코드에서 i,j,*p,*q의 값이 각각 무엇일까?
#include <stdio.h>
int main(){
int i,j,*p,*q;
i=10;
p=&j;
q=malloc(sizeof(int));
*q=i;
j=i;
q=p;
*q=5;
printf("%d %d %d %d", i,j,*p,*q);
}
일단 i와 *q는 간단하다. i=10이고 *q=5이다.
문제는 j와 *p가 매우 헷갈린다.
p=&j이므로 *p=j이고 q=p=&j이므로 *q=j이다. 근데 *q=5이므로 *p와 *q도 전부 5가 된다.
따라서, 순서대로 10,5,5,5가 답이다.
'Algorithm in C > Lecture Note' 카테고리의 다른 글
내가 이해하려고 쓰는 [구조체] Struct (0) | 2021.05.03 |
---|---|
내가 이해하려고 쓰는 [퀵정렬] Quick sort (0) | 2021.05.02 |
내가 이해하려고 쓰는 [힙정렬] Heap sort (0) | 2021.04.17 |