본문 바로가기

C언어8

[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언어] 포인터가 가리키는 메모리를 참조하는 * 연산자 예제 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include int main(void) { int num1 = 100, num2 = 100; // 변수 num1과 num2를 선언하고 각각 100으로 초기화 int * ptr; // 포인터 변수 ptr을 선언 ptr = &num1; // 포인터 ptr이 num1을 가리키게 함 (*ptr) += 20; // num1 += 20 과 동일 ptr = &num2; // 포인터 ptr이 num2를 가리키게 함 (*ptr) -= 20; // num2 -= 20과 동일 return 0; } Colored by Color Scripter cs 이 소스코드에서 num1은 100에서 20이 증가된 120으로 다시 저장되고, num2는.. 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언어] 포인터 변수에 있어 자료형의 의미 2 1 2 3 4 5 6 7 8 9 10 11 12 #include int main() { double num2 = 3.14; int * ptr2 = &num2; *ptr2 = 10; } cs 여기에서 변수 num2가 더블형인데, num2를 가리키는 포인터 변수 자료형을 int라고 설정해놓으면, 포인터는 자기가 가리키는 변수가 원래 더블형이라 8바이트 임에도, 정수형으로 인식하여 4바이트로 num2 변수에 데이터 값 10을 메모리에 다시 저장하게 된다. 그러면 8바이트 짜리로 메모리에 저장되어 있던 값에 정수형 4바이트 짜리로 저장하게 되니(4바이트 짜리로 알고 메모리에 접근하게 되니) 앞의 4바이트는 10이라는 정수값이 채워지고, 기존의 8바이트 짜리 메모리의 뒤 4바이트는 3.14의 흔적이 남아있게 된다.. 2020. 8. 9.
[C언어] 포인터 변수에 있어 자료형의 의미 1 포인터 변수를 선언할 때 사용되는 * 연산자 그와 더불어 그 앞에 일반 변수와 같이 자료형을 표현하는데, 이 자료형은 포인터 변수에 관한 내용이 아니라, 포인터가 가리키는 변수의 값의 자료형에 관한 것이다. int * ptr 이라고 할 때, 포인터 변수 ptr 앞에 붙는 자료형 int는 ptr이 가리키는 변수(엄밀히 말하면, 그 변수의 메모리에 저장된 값)의 자료형을 나타낸다. int ptr = &num에서 처럼, 그냥 일반 변수 ptr에 변수 num의 주소값을 저장할 수는 있지만, 이럴 경우, 일반 변수 ptr은 변수 num의 주소값 외에는 num이라는 변수(메모리)에 저장된 값에 대한 정보는 알 수가 없다. 여기서 자료형 int는 오롯이 ptr이라는 변수가 정수형이라는 정보일 뿐이다. 그래서, 1 2.. 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.