본문 바로가기

C언어/예습

[C언어 예습]DAY14_포인터(2) 정적 배열, 동적 배열, 이중 포인터

포인터(2)

- 함수의 매개변수의 종류에 따라 호출패턴(방식)이 다르다.

 

call by value
int f(int x){
              return 2*(*x)+1;
}
f(3);
call by address
void f(int* x){
                 *x = 2*(*x)+1;
}

int data = 3;
int* PData = &data;
f(PData);

- 포인터의 사용이유 :
               다른 지역에 있는 변수의 주소에 접근하여 값을 변경 혹은 수정할 수 있다.


#include <stdio.h>
void f(int*);

void main() {
	int num = 0;
	f(&num);
	printf("%d\n", num);

}

void f(int* data) {
	*data = 10;
}

//선택정렬 함수 만들기

#include <stdio.h>
void sort(int*, int);

void main() {
	int arData[5] = { 1, 8, 9, 2, 6 };
	int length = sizeof(arData) / sizeof(int);
	sort(arData, length);

	for (int i = 0; i < length; i++) {
		printf("%d ", *(arData + i));
	}
	printf("\n");
}

void sort(int* list, int length) {
	for (int i = 0; i < length - 1; i++) {
		for (int j = i+1; j < length;j++) {
			if (*(list + i) > *(list + j)) {
				int temp = *(list + i);
				*(list + i) = *(list + j);
					*(list + j) = temp;
			}
		}
	}

}

//int형 변수를 선언하여 사용자에게 값을 입력받은 후
//해당 값을 2배로 바꿔주는 void타입 함수 선언 및 사용
//call by adress
//제곱으로 바꿔주는 void타입 함수 선언 및 사용

include <stdio.h>

void f(int*);
void g(int*);

void main() {
	int num = 0;
	int data = 0;
	int* PData = &data;
	scanf_s("%d", PData);
	num = data;
	f(PData);
	printf("%d\n", *PData);

	PData = &num;
	g(PData);
	printf("%d\n", *PData);
}

void f(int* data) {
	*data *= 2;
}

void g(int* data) {
	*data *= *data;
}

 


이중 포인터

: 포인터의 주소값을 담는 저장공간

 

포인터에 있는 주소값을 바꾸고 싶을 때, 사용

 


#include <stdio.h>

void main() {
	int data = 10;
	int * PData = &data;
	int ** PPData = &PData;

	printf("%p\n", &data);
	printf("%p\n", PData);
	printf("%p\n", *PPData);

}

#include <stdio.h>
void f(int**);

void main() {
	int data = 10;
	int* PData = &data;


	printf("%d\n", *PData);
	f(&PData);
	printf("%d\n", *PData);

}

void f(int** x) {
	int data = 20;
	*x = &data;
}

정적배열

: 자동으로 내려간다.

동적배열

: 정적배열보다 느리다, 사용자가 직접 내려줘야한다.