STUDY/정글

[C] 포인터 문제풀이

Nobb 2025. 10. 11. 12:51

 

## 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";