C프로그래밍

C프로그래밍/개인 공부

함수에서 인자를 포인터로 받으면 무조건 원본 변경이 될까?

포인터를 활용하면 '원본의 변경'을 할 수 있다. 라고 배운다. 하지만, 변경이 안되는 헷갈리는 부분이 있어서 글로 남긴다. #include void PointerChange(int *pointer) { pointer = pointer + 10; //주소 자체를 변경 } int main(void) { int a = 10; int *p = &a; printf("a = %d\n", a); printf("p가 가리키는 주소 = %u\n", p); PointerChange(p); printf("p가 가리키는 주소 = %u\n", p); return 0; } 변수 a = 10이고 포인터 변수 p 는 a를 가리키고 있다. PointerChange함수는 매개변수로 포인터 변수를 받고, 받은 포인터 변수를 10증가시킨..

C프로그래밍/개인 공부

2차원 배열 포인터 형으로 함수 인자로 전달하기

만약 2차원 배열을 함수의 인자로 전달해서(포인터 형식으로), 그 2차원 배열을 정렬한다고 가정해보자. void sort(int (*arr)[5], int n) { int i = 0; int j = 0; int least; int temp; for(i = 0; i arr[n][j]) least = j; } temp = arr[n][i]; arr[n][i] = arr[n][least]; arr[n][least] = temp; } } 2차원 배열을 포인터 형식으로 받고, n번째의 행을 정렬하는 함수다. 여기서 봐야할 부분은 void sort(int (*arr)[5], int n) 이다...

C프로그래밍/개인 공부

C언어 - 함수의 포인터

함수 포인터 지금까지 우리는 포인터를 주로 변수를 가르키는데 사용했다. 하지만, 포인터는 함수도 가르킬 수 있다. 함수도 실행되는 주소를 가진다. 일반적인 포인터는 변수가 저장되어있는 주소를 가르키지만, 함수 포인터는 함수가 시작되는 주소를 가르킨다. 함수 포인터는 이렇게 선언한다. int (*pf)(int, int); int형이고 매개변수로 int, int를 갖는 함수 포인터 pf. 라는 뜻이다. 예를들어, sub함수를 정의하고 sub함수를 가르키는 함수포인터를 설정해보자. int sub(int, int); //함수원형 정의 int (*pf)(int, int); //함수 포인터 정의 pf = sub; //함수의 이름을 함수 포인터에 대입. 어려울 것이 없다. 여기서 눈여겨 봐야할 점은, pf = sub..

C프로그래밍/개인 공부

C언어 - 포인터의 배열, 배열의 포인터

포인터의 배열 포인터의 배열이란, 배열의 원소안에 포인터들이 들어가는 배열이다. int *ap[10]; //10개의 주소가 들어갈 수 있는 포인터 배열 선언 포인터 배열은 이렇게 선언한다. 포인터의 배열을 사용하면 문자열을 저장할 때, 장점이 있다. 예를 들어, computer라는 2차원배열을 선언하고 원소를 넣어보자. char computer[3][8] = { "Mac", "Samsung", "Lenovo" }; 보통 이렇게 배열을 선언하고 초기화 할 것이다. 하지만, 이렇게 한다면 "Samsung"문자열은 8바이트를 다 사용하지만, Mac은 3바이트만 사용하게된다. 즉, "Mac"이란 문자열은 5바이트를 사용하지 않기때문에 메모리의 '낭비'가 생긴다. 그렇다면, 포인터의 배열을 사용하여 문자열을 저장..

C프로그래밍/개인 공부

C언어 - 이중 포인터

이중 포인터 포인터는 다른 변수의 주소를 가르킨다고 학습했었다. 포인터도 변수이기 때문에, 포인터가 포인터를 가르킬 수 있다. 그것을, 포인터의 포인터. 즉, '이중 포인터'라고 한다. 간단한 일반적인 포인터의 예를 보자, int i = 10; int *p = &i; 이것은 지금까지 학습했던, 일반적인 포인터이다. 포인터 p는 변수 i를 가르키게 된다. 이중 포인터는 이렇게 표현한다. int i = 10; int *p = &i; int **q = &p; 포인터 p는 변수 i의 주소를 가르키고, 이중포인터 q는 포인터p의 주소를 가르킨다.(포인터 p도 변수이기 때문에 주소를 갖는다.) 텍스트로는 이해가 힘드니 그림으로 다시 알아보자. 참조연산자 * 주소연산자 & 를 활용해서 누가 어떤 값을 갖는지 확인해보..

C프로그래밍/개인 공부

C언어 - 연결리스트

연결리스트(linked list) 지금까지는 다량의 데이터를 '배열'에 저장했었다. 배열을 사용하면 쉽고 빠르게 구현이 가능하지만, 크기가 고정되기때문에 크기를 늘이거나 줄이는 동적인 활동을 하지 못하는 단점이 있다. 예를 들어, 만약 a[3]에 데이터를 삽입하려면 a[3]부터 모든 데이터를 뒤로 밀어서 빈 공간을 만들어야한다. 이렇듯, 기존의 데이터들을 이동시켜야한다. 연결 리스트(linked list)는 이런 단점을 극복할 수 있다. 연결리스트는 각각의 원소가 포인터를 사용해서 다음 원소의 위치를 가르킨다. 즉, 포인터를 사용해서 자료들을 연결한다. 이런식으로 A박스에 있는 원소가 포인터로 B를 가르키고 B에 있는 원소가 포인터로 C를 가르킨다. 그래서 데이터의 삭제와 삽입이 쉽다 데이터를 연결하는 ..

Jminu
'C프로그래밍' 카테고리의 글 목록