Language/C

Language/C

포인터(4)

마저 못한 정리를 시작하자. 상수형 문자열을 가르키는 포인터. 지금까지는 배열을 통해 문자열을 선언했었다. 하지만 우리는 포인터를 배우면서 배열은 상수형 포인터임을 배웠다. 그렇다면 포인터를 통해 문자열을 다룰 수 있을까? char str1[] = "string 1"; 이는 배열을 통해 선언한 문자열이다. 더 정확히 말하면 변수 형태의 문자열이다. 우리가 임의로 문자열의 일부를 수정할 수 있기 때문이다. 포인터와 배열은 상수냐 변수냐에 따라 구분되는 같은 것이라고 볼 수 있다. 그렇기에 우리는 다음처럼 쓸 수도 있다. char *str2 = "string 2"; 이렇게도 역시 가능하다. 배열과 포인터 모두 문자 s의 주소값을 나타낸다. 그럼 차이점이 무엇인가? 몇가지 차이점이 존재한다. 첫번째, 메모리상..

Language/C

포인터(3)

배열의 포인터 연산 앞의 배열에 관한 내용을 조금 복습하자면, 배열의 이름은 상수형 포인터라고 했다. 그렇다면, *연산이 가능할까? 정답은 Yes이다. 다음 예제를 살펴보자. #include int main () { int arr_i[3] = {1,2,3}; double arr_d[3] = {1.1, 2.2, 3.3}; printf("%d %g\n", *arr_i, *arr_d); *arr_i += 10; *arr_d += 120.5; printf("%d %g\n", arr_i[0], arr_d[0]); } 실행 결과 1 1.1 11 121.6 포인터의 *연산이 무리없이 작동하는 것을 알 수 있다. 포인터를 배열의 이름처럼 배열이름이 포인터이고 포인터처럼 사용할 수 있다면, 포인터를 배열처럼 사용할 수 ..

Language/C

포인터(2)

포인터의 주의사항 저번에 포인터의 형이 중요하다고 하였다. 이외에도 주의할 점이 있는데, 선언만 하고 초기화를 하지 않을 때이다. 우리는 C언어에서 변수를 선언만 하고 초기화하지 않는 경우가 있는데, 전역변수나 static변수가 아닌이상 임의의 값으로 초기화 된다. 여기서 문제는 포인터는 메모리상의 주소이고 이 주소값에 잘못 접근하게 되면 중요한 영역에 접근할 수 있어 치명적이기 때문이다. (물론 잘못된 메모리 접근은 컴퓨터가 막아주긴 한다.) 따라서 우리는 널(NULL)포인터를 사용하는데, 이러한 문제를 방지하기 위해 사용한다. int a; int *pa = NULL; // 널포인터로 초기화 포인터와 배열 사실 배열은 포인터와 굉장히 긴밀한 관계를 갖고 있다. 아니 긴밀하다 못해 그냥 동치라고 봐도 무..

Language/C

포인터(1)

메모리에 직접적인 접근을 가능하게 해주는 기능. 우리가 변수를 선언하면 이 변수는 메모리에 공간이 할당된다. 이때 메모리상에서 할당 받은 주소값을 저장하는 변수가 바로 포인터 변수이다. 포인터 변수 선언하기 결국은 주소값을 변수에 저장해야 하니 포인터값을 변수에 넣어야 한다. 선언 및 초기화 방법을 알아보자. #include int main () { int num = 10; // int형 변수 int * pnum; // int형 포인터 선언 pnum = # //num의 주소값으로 초기화, int * pnum = #로 한번에 초기화도 가능하다. printf("num : %d, pnum = %p", num, pnum); // %p는 주소를 출력하기 위한 서식문자 } 원하는 타입의 포인터 변수를..

Language/C

C언어 공부

열혈 C 프로그래밍 - 윤성우 저 이 책으로 C언어를 공부하고자 한다

CodeJin
'Language/C' 카테고리의 글 목록 (2 Page)