본문 바로가기

포인터7

[C언어] * 연산자와 [ ] 연산자 : 포인터를 대상으로 사용할 수 있는 연산자 앞에서 말한 바와 같이 포인터 변수와 함께 배열명이 포인터로 사용된다. 단 그 둘의 차이점은 변수로 사용되느냐 상수로 사용되느냐였다. 보통 요소의 순서를 나타낼 때 사용하는 [ ]연산자, 포인터를 선언하거나 어떤 메모리에 접근할 때 사용하는 * 연산자로 익숙하지만, 우리가 알고 있는 포인터 외에 배열에서 배열의 이름으로 쓰이고 있는 배열명도 동일하게 포인터(어느 메모리를 가리킨다)로서 기능을 하기 때문에, 포인터나 배열명이나 둘 다 포인터를 피연산자로 하는 * 연산자와 [ ] 연산자를 사용할 수 있다. 다시 정리를 하자면, 포인터는 가리키고 있는 대상의 주소값을 가지고 있지만, 그 뿐 아니라 대상에 대한 (메모리에 접근하는 방식을 결정할) 자료형에 대한 정보까지 같이 가지고 있어야 포인터라고 할 수 있다. 2020. 8. 14.
[C 언어] 배열에 관해서: 배열명 =포인터 앞서 배열의 배열명이 상수 포인터라고 했다. 다시 반복하자면, 배열명은 그 배열의 첫번째 요소를 가리키고 있다.(주소값을 가짐) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include int main(void) { int arr[3] = {0, 1, 2}; printf("배열의 이름: %p \n", arr); printf("첫 번째 요소의 주소: %p \n", &arr[0]); printf("두 번째 요소의 주소: %p \n", &arr[1]); printf("세 번째 요소의 주소: %p \n", &arr[2]); return 0; } Colored by Color Scripter cs 를 실행시켜 얻은 실행결과는 다음과 같다. 실행결과에서 확인하게 되는 점. 1. 배.. 2020. 8. 10.
[C언어]포인터 VS 배열에 대하여: 변수 VS 상수 포인터와 포인터가 가리키는 변수를 선언해보자. int * ptr; int var; ptr = &var; 이렇게 프로그램을 실행시키면 포인터는 var를 가리키고 있게 된다. ptr ㅡ> var 배열을 선언해보자. int arr[10]; 이렇게 하면 이 배열의 이름인 arr는 10개의 요소로 구성된 배열의 첫번째 값(0번째 요소)의 주소값을 의미한다. 이는 arr이라는 배열의 이름이 arr 배열의 첫번째 값을 가리키고 있다. 따라서, arr이라는 배열명도 일종의 포인터이다. arr ㅡ> arr[0] 위의 ptr은 변수이기 때문에, ptr = &num와 같이 가리키는 값을 변수 var에서 변수 num으로 바꿀 수 있다. 그러나, arr은 오로지 배열의 처음인 요소만 가리킬 수 있다. 위의 ptr과 같이 arr.. 2020. 8. 10.
[C언어] 포인터 사용시 주의해야할 점: 포인터 변수의 초기화 1 2 3 4 5 6 7 8 9 10 11 12 #include int main(void) { int * ptr; // ptr의 값이 초기화되지 않음 * ptr = 123 // ptr이 가리키고 있는 곳에 123을 저장하려 함 . . . } Colored by Color Scripter cs !! 포인터 ptr의 값을 따로 초기화하지 않으면, 주소값이 저장되는 ptr에 쓰레기 값으로 초기화된다. 따라서 알 수 없는 곳에 123이라는 값이 저장될텐데, 그 알 수 없는 곳이 컴퓨터 메모리 상 중요한 부분일 수도 있으므로 이러한 소스코드는 매우 위험하다. 1 2 3 4 5 6 7 8 9 10 11 12 #include int main(void) { int * ptr = 200; // ptr의 값이 200으로 .. 2020. 8. 10.
[C언어] & 연산자 (Ampersand, 앰퍼샌드) 1) & 연산자가 1개이면 비트 연산자 AND를 나타낸다. 비트 연산자는 정수형 자료에서만 사용이 가능하다. 이때, & 연산자는 0과 1의 2진수로 되어 있는 비트 단위의 연산을 수행하는데, 대응되는 두 bit가 모두 1일 때만 결과가 1이다. 예를 들어, x: 1 0 0 1 0 1 0 1 y: 0 1 0 0 1 1 1 1 로 저장되어 있다고 하자. 그러면, x & y는 (x와 y를 &연산 하면) 0 0 0 0 0 1 0 1 이 된다. 2) & 연산자가 2개이면 논리연산자 AND를 나타낸다. &&는 논리곱(AND)이라고 하며, 양쪽 모두 참일 때만 참이다. 예를 들어, a: 참 b: 거짓 c: 참 이라고 하자. 그러면, a && b는 거짓이 되고, a && c는 참이 된다. C등 여러 프로그래밍 언어에서.. 2020. 8. 9.
[C언어] 포인터 변수 선언하기(C pointer) [포인터 변수 선언하는 방법] 예제를 들어 설명해 보자면 하기와 같다. int * p_num; // int형 포인터 변수 p_num 선언 double * p_dnum; //double형 포인터 변수 p_dnum 선언 unsigned int * p_ui; //unsigned int형 포인터 변수 p_ui 선언 char * p_ch; //char형 포인터 변수 p_ch 선언 즉, " type * 변수명; "의 형태로 선언한다. 해당 선언에 대해서 아~~주 쉽게 해석을 해보면 아래와 같다. int * p_num; 의 [해석] --> p_num은 포인터 변수이다. 즉, 주소를 담는 변수이다. --> 그런데, 해당 변수에 담겨 있는 주소에 찾아가보면 int형의 숫자가 담겨 있을 것이다. --> * (별표)는 현재.. 2020. 8. 9.
[C언어] * 연산자(별표 기호, Asterisk 연산자)에 대하여: 곱하기, 포인터 변수 선언, 메모리로의 접근 C 프로그래밍 언어를 공부하다 보면 컴퓨터 언어를 처음 접하는 사람으로서 그 의미가 헷갈리는 연산자가 있다. 바로 * 연산자(별표 기호, Asterisk 연산자) 이다. 한국말에도 '배'라는 말이 신체 일부인 '배'와 먹는 '배', 타는 '배', 여러 '배'라는 여러 가지 뜻이 있듯이 이 * 연산자도 세가지의 의미가 있다. 위의 '배'는 문맥에 따라 무슨 '배'인가를 추론해내듯, * 연산자는 * 연산이 이루어지는 피연산자가 무엇이냐에 따라서 * 연산자의 의미가 달라진다. C 언어에서 *(별표, 에스테리스크) 연산자가 사용되는 경우는 하기의 세가지 경우이다. 1) 5 * 8 ; 피연산자가 숫자로 나올 경우 이 때, * 연산은 곱하기를 의미한다. 2) char * ptr (char* ptr, char *pt.. 2020. 8. 9.