## G4G [C Pointer Basics] 문풀 12~16번 (날짜: 25-10-11)
https://www.geeksforgeeks.org/quizzes/pointers-gq/
C Pointer Basics
C Pointer Basics Quiz will help you to test and validate your C Quiz knowledge. It covers a variety of questions, from basic to advanced. The quiz contains 43 questions. You just have to assess all the given options and click on the correct answer.
www.geeksforgeeks.org

> 핵심: 포인터 선언 시, 둘다 * 따로 붙여줘야됨 (보기처럼 하면 ptr2는 일반 int변수됨)
> 정답: False

> 핵심: char끼리 연산 시, ASCII 코드값의 연산 됨.
> 풀이:
# g = &g[0]
# g[6] = (g[]의 7번값) = 'o' = 111
# g[8] = (g[]의 9번값) = 'g' = 103
>> g + g[6] - g[8]
= (g[0] 주소값) + 111 - 103
= (g[0] 주소값) + 8
= 'geeksfor<g>..' <<의 주소
>> 정답: %s로 찍어내므로, g부터 끝까지 문자열 출력하면 됨 = geeks

>핵심:
#define부분 : 매크로함수로 전처리단계에서 실제 호출한 부분에 저 코드가 삽입됨.
>> cf) 함수호출로 인자 보내면 복사된 값이 간거라(=call-by-value) 함수 끝나면 사라짐.(+원본영향x)
>> 실제삽입) main함수 안에서 작동하므로 실제 값이 변경됨***
> 정답: C (문제는 간)
# 포인터 기초 26~30번 (날짜: 25-10-15)
https://www.geeksforgeeks.org/quizzes/pointers-gq/
C Pointer Basics
C Pointer Basics Quiz will help you to test and validate your C Quiz knowledge. It covers a variety of questions, from basic to advanced. The quiz contains 43 questions. You just have to assess all the given options and click on the correct answer.
www.geeksforgeeks.org
# 26

## 주의할 점
- sizeof(포인터)는 말그대로 주소 담은 변수이기 때문에
참조하는 변수의 타입과 상관없이 항상 동일한 Byte크기 가짐 (시스템 별 주소크기와 동일 _ex. 64bit 컴퓨터- 8Byte)
# 27

## 주의
- 포인터끼리의 뺄셈 연산은 원소 개수 차로만 계산 (주소로 봤을 땐 한 칸당 4Byte차이지만)
> sizeof(ptr2-ptr1) = 4 * (원소개수차)
> ptr2 - ptr1 = (원소개수차)
# 28

## 포인터 형변환
int *ptr >> 4Byte 간격으로 봄
char *ptr >> 1Byte 간격으로 봄
>> 풀이:
int arr[] = {10,20,30,40,50,60}
int *ptr1 = arr;
int *ptr2 = arr + 5; # &arr[0]위치에서 5칸(= 5*4 Byte) 이동
>> ptr2 - ptr1
>> (char*)ptr2 - (char*)ptr1
: char(=>1바이트단위)씩 보겠단 얘기니까 한 숫자 지나가려면 4칸이동하는셈
> &arr[0]의 4바이트중 첫번째 바이트 ~ &arr[5]의 4바이트중 첫번째바이트 사이의 바이트수는 4*4+3+1 = 20칸
> 20
#30

## 핵심
# 포인터 기초 31~39번 (날짜: 25-10-17)
https://www.geeksforgeeks.org/quizzes/pointers-gq/
C Pointer Basics
C Pointer Basics Quiz will help you to test and validate your C Quiz knowledge. It covers a variety of questions, from basic to advanced. The quiz contains 43 questions. You just have to assess all the given options and click on the correct answer.
www.geeksforgeeks.org
# 31

## 배열을 함수 인자로 받는법
1) int arr[]
2) int* arr
>> 두 가지 동일함! (1번의 arr -> int* arr과 완전히 같은 의미로 쓰임)
## 잊지말자, 포인터의 사이즈는 주소의 사이즈와 동일하다! (같은 컴퓨터면 모든 포인터 사이즈 동일)
- 주소 담아야하는 포인터의 크기는 항상 주소의 길이 (무슨 자료형을 가리키느냐와 무관)
- 64bit 컴퓨터 -> 주소 길이=포인터 크기=8Byte / 32bit 컴퓨터 -> 주소길이=포인터크기=4Byte
# 32

(선지는 항상 끝까지 읽고 고르기...)
## 포인터의 기능
A- 서로 다른 함수가 지역변수를 공유하고 수정할 수 있게 해줌
B- 큰 구조체를 복사하지 않고 전달할 수 있게 해줌
C- 연결리스트나 트리 같은 복잡한 자료구조를 구현할 수 있게 해줌
#33

(문제는 쉬움. j의 주소를 보내 그 주소의 값을 2로 바꿈. 이때 중요한 건 p와 q는 포인터변수일 뿐 x,y와 무관)
## getchar() 개념
: C 표준 입출력 함수 중 하나로, 사용자가 키보드에서 한 문자를 입력할때까지 기다렸다가
그 입력된 문자를 읽어 반환하는 함수.
> 의외의 용도: 프로그램이 바로 종료되지 않도록 잠깐 멈추게 하는 역할
(사용자가 엔터나 아무 키를 입력할 떄까지 기다림 -> 입력 들어오면 그제서야 프로그램 종료됨)
## 36

## void 포인터
- 역참조 못한다. 하고싶으면 해당 자료형으로 캐스팅(형변환) 해줘야함
ex) printf("%d", *(int *)ptr); >> 이렇게 하면 제대로 12가 출력됨.
## void 포인터
: 어떤 자료형의 주소든 담을 수 있는 포인터
- 해당 주소에 뭐가 들었는진 몰라도 주소 자체는 갖고있겠단 의미
> 저장만 가능
> 역참조 불가(역참조- 주소에있는값 읽는 행위. 해당 주소 데이터의 타입을 알아야 올바르게 읽기가능)
-ex) int* p = &a; / print(*p) -> a의주소에 가서 int형(=4Byte)만큼을 읽겠다.
근데 void 포인터는 가리키는 자료형을 모르니 해당 주소에서 몇 Byte 읽어야하는지 모름.
# void 포인터 선언
void *ptr;
## 37

>> 틀렸으면 어디가서 포인터 좀 공부했다고 하지 말자^.^ (나한테 하는 말..)
## 항상 틀리는건 "CALL-BY-VALUE "
void swap(char *x, char *y) { #여기서의 x,y는 swap의 지역변수(복사된 주소값만 받음. main의 x,y와 무관)
char *t = x;
x = y;
y = t;
## 여기서 x가 담던 주소값과 y가 담던 주소값을 switch했으나, "원본에 영향 1도 없음."
'''
- 그냥 여기서 원본의 주소값들을 향해 서로 손가락질 하다 끝난 것 뿐임.(값 변화없음)
- swap() 종료되면 여기서 쓰던 x,y포인터들은 소멸되고 끝
'''
}
## 38

## ++*p
- 전위연산자 '++'와 '*'은 같은 우선순위지만, 전위연산자들은 오->왼 쪽으로 결합함.
> *가 먼저 적용된 뒤, ++ 적용됨 ( => ++(*p) 와 동일해짐 )
# 전위(2) ====
++(*p) : 가리키는값 +=1 #바뀌는 대상: 값
++*p : 가리키는값 +=1 #바뀌는 대상: 값
# 후위(1) + 전위(1) ====
(*p)++ : 가리키는 값 +=1 #바뀌는 대상: 값
*p++ : 포인터 +=1 -> 역참조 #바뀌는 대상: 포인터
## 39

## 배열에서의 인덱스 의미
: 단순히 0~n-1 '인덱스'의 값을 꺼낸다기보다
arr[i] -> *(arr + i)
>> 같은 의미로 arr[-1] -> *(arr - 1) //배열의 범위보다 앞으로 넘어가서 불가능
chat *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" };
char **p = argv;
char *t = (p += sizeof(int))[-1]; ###
>> t = &(argv += 4)[-1]; #배열이름 = &배열[0]
>> t = (&argv[4])[-1]; # [-1] <=> *(p-1)
>> t = &argv[3];
>> *t = "gh";
'STUDY > 정글' 카테고리의 다른 글
| [TIL] 포인터 문제풀이(2) - G2G (0) | 2025.10.15 |
|---|---|
| [정글] W5 퀴즈 (주요 내용 정리) (0) | 2025.10.14 |
| [정글] W4 학습 키워드 정리 - DP, 그리디, LCS, 배낭, 연결리스트 (0) | 2025.09.25 |
| [정글] W3 학습 키워드 정리 (1) | 2025.09.23 |
| [정글] W2 키워드 정리- 이분탐색, 분할정복, 스택, 큐, 우선순위큐, 연결리스트, 해시테이블 (0) | 2025.09.16 |