본문 바로가기

BackEnd/C

다차원 배열 이름의 포인터형 1. 다차원 배열의 포인터형이란? 2차원 배열 이름의 포인터 형을 결정짓는 정보는 2가지이다. - 배열 요소를 구성하는 변수의 자료형 - 배열의 가로길이 예를 들어 2차원 배열 double arr[4][5]의 배열 이름 arr과 동일한 포인터 형의 변수는 다음과 같이 선언된다. 2. 2차원 배열의 포인터형의 배경 앞서 1차원 배열의 포인터형과는 2차원 배열의 포인터형은 다른데 그 이유를 보자. 1234567891011121314#include int main(void){ int arr1[3][2]; int arr2[3][3]; int arr3[3][4]; printf("%d %d \n", arr1, arr1+1); printf("%d %d \n", arr2, arr2+1); printf("%d %d \n..
배열의 이름은 상수 형태의 포인터이다. 1. 배열의 이름은 상수 형태의 포인터 포인터는 주소값을 지니며, 더불어 참조하는 대상의 자료형 정보도 지니는 변수나 상수를 의미한다. 그런데 배열의 이름은 첫번째 요소의 주소 값이다. 그리고 배열 또한 참조 대상에 대한 자료형 정보도 지닌다! 그렇기 때문에 배열의 이름도 포인터이다! 예제로 증명해 보자. 12345678910#include int main(void){ int arr[3]={100, 200, 300}; printf("arr[0]는 %d, *arr는 %d \n", arr[0], *arr); return 0;}Colored by Color Scriptercs 1arr[0]는 100, *arr는 100cs 7행을 보면 배열의 이름을 이용해서 *arr 포인터 연산식을 구성했다. 이식은 arr이 ..
제한된 형태의 포인터 연산 1. 포인터를 가지고 덧셈과 뺄셈이 가능 포인터 연산이라는 것은 포인터를 피연산자로 하는 연산 전부를 의미한다. 대표적인 포인터관련 연산자는 다음과 같다. * 메모리참조& 주소 값 반환 그리고 포인터의 덧셈과 뺄셈이 있는데 일반적인 것과는 의미가 다르다. 예제를 보자 1234567891011121314151617181920212223242526272829 #include int main(void){ int num1=10; double num2=7.12345; int * ptr1=&num1; double * ptr2=&num2; printf("ptr1: %d \n", ptr1); printf("ptr2: %d \n\n", ptr2); ptr1++, ptr2++; printf("ptr1: %d \n", pt..
포인터 배열 1. 포인터 변수로 이루어진 배열 포인터 변수도 일반적인 변수로 인식하는것이 중요하다. 포인터 배열은 포인터 변수로 이뤄진 배열이다. int * arrptr[3]; //int형 포인터 변수3개로 이뤄진 1차원 배열 선언 12345678910111213141516171819 #include int main(void){ int n1, n2, n3; int* arrPtr[3]={&n1, &n2, &n3}; int i; for(i=0; i
포인터의 포인터 1. 포인터 변수도 변수니 당연히 주소값을 얻을 수 있다. 포인터 변수는 선언시 메모리 영역에 4바이트의 메모리 공간 할당이 이루어진다. 때문에 포인터 변수에 대한 주소 값도 당연히 존재한다. 주소값은 & 연산자를 똑같이 사용하면 얻는다. 123456789101112131415161718#include int main(void){ int num1=3; double num2=3.15; int * ptr1=&num1; double * ptr2=&num2; printf("ptr1의 저장 값: %#x \n", ptr1); printf("ptr1의 주소 값: %#x \n\n", &ptr1); printf("ptr2의 저장 값: %#x \n", ptr2); printf("ptr2의 주소 값: %#x \n\n", &..
문자열 배열과 문자열을 참조하는 포인터 C언어에서 문자열을 표현하는 방식은 2가지로 나뉜다. 하나는 변수 형태로 표현하는 방식이고, 또 하나는 상수 형태로 표현하는 방식이다. 1. 변수 형태의 문자열 배열을 선언하면서 문자열을 초기화 하면, 배열에는 문자열이 저장된다. char vStr[30] = "String Variable"; 문자열이 다른 어딘가에 저장되는 것이 아니다. 그냥 배열에 저장될 뿐이고, char형 배열을 통해서 문자열을 참조한다. https://cg-developer.tistory.com/179 참고하자 2. 상수 형태의 문자열 포인터를 이용해서 상수 형태의 문자열을 참조하는것도 가능하다. char * cStr = "String Variable"; 이렇게 선언하면 문자열은 상수의 형태로 메모리 공간에 자동으로 저장된다. ht..
&연산자가 반환하는것은? &연산자가 반환하는 것은 상수 형태의 포인터 &연산을 통해 얻은 주소값은 단순한 숫자가 아니라 상수 형태의 포인터이다. 포인터는 주소값과 함께 참조하는 대상의 자료형 정보도 지니는 변수와 상수를 의미한다. 자료형 정보는 *연산을 통한 메모리의 접근 방법을 결정하는 중요한 정보가 된다. 결론적으로 &연산자 또한 주소값과 참조 대상의 자료형 정보도 동시에 반환한다. 12345678910111213int main(void){ int num1=7; double num2=0.0012; *(&num1)+=1000; *(&num2)+=1000.0; printf("%d \n", num1); printf("%f \n", num2); return 0;}cs 1210071000.001200cs 6~7행을 보면 &연산의 결과..
잘못된 포인터 사용의 예와 NULL 포인터 1. 초기화되지 않은 포인터는 어디를 가리킬지 모른다. 지역변수는 선언과 동시에 초기화하지 않으면 쓰레기 값으로 초기화가 된다. 포인터 변수도 지역변수의 형태로 선언하고 초기화하지 않으면 쓰레기 값으로 초기화가 된다. 문제는 이 쓰레기 값을 주소 값으로 해석해서 연산하는 경우에 발생한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 int main(void) { int * p1; double * p2; /* 쓰레기 값 확인하기 */ printf("쓰레기 값 1: %#x \n", p1); printf("쓰레기 값 2: %#x \n\n", p2); /* 잘못된 연산 */ printf("어떤 정수가 찍힐까? %d \n", *p1); printf("어떤 ..