본문 바로가기

BackEnd/C

포인터 형과 *연산자 1. 포인터 형 이란? 기존의 데이터 형은 자료형이라 불리는데 대표적인 데이터 형들은 다음과 같다. int, char, long, float, double 이처럼 데이터에 데이터형이 존재하듯이 포인터에도 포인터 형이 존재한다. int * > int형 포인터 char * > char형 포인터 double * > double 형 포인터 2. *연산자 *연산자는 변수의 이름을 이용해서 직접 접근하는 것이 아니고 포인터 변수를 이용해서 간접적으로 접근할때 사용되는 연산자이기 때문에 간접 참조 연산자라고도 한다. 단항 연산자로 *가 사용되면 포인터가 가리키는 메모리 공간의 접근을 의미한다. 아래 예제에서 *ptr은 변수 num을 가리킨다. 12345678910111213141516171819int main(voi..
포인터 변수 선언 1. 포인터 변수? 포인터 변수란 주소 값의 저장을 위해 선언되는 변수이다. 2. 주소 값 얻기(&연산자) &연산자는 피연산자의 시작 주소 값을 반환한다. 12345678910111213141516int main(void){ int num1=3; char num2='A'; double num3=3.15; printf("num1의 저장위치: %#x \n", &num1); printf("num2의 저장위치: %#x \n", &num2); printf("num3의 저장위치: %#x \n\n", &num3); printf("num1의 주소 값 크기: %d \n", sizeof(&num1)); printf("num2의 주소 값 크기: %d \n", sizeof(&num2)); printf("num3의 주소 값 크..
포인터와 메모리 1. 포인터란? 포인터는 주소값을 담고 있는 변수 또는 상수이다. 일단은 이 정도로 포인터를 정의하고 더 깊이 알기 위해 배경지식을 알아보자 (추가적으로 포인터는 참조하는 대상의 자료형 정보도 지니는데 이건 나중에 다시 볼것이다.) 2. 메모리의 주소체계 포인터가 메모리의 주소 값과 관련이 있는 만큼, 메모리의 주소체계를 알아보자 주소 값 하나가 가리키는 메모리 공간의 크기는 1바이트이다. 아래 그림에서 0x12ff73번지는 8개의 비트가 묶인것이다. 즉 주소값은 1바이트 단위로 할당이 된다. 3. 메모리의 주소 값 자체를 표현하는데 필요한 바이트 크기는? 메모리의 주소 값 자체를 표현한다는것은 메모리의 주소값을 메모리에 저장한다는 뜻인데, 표현할 주소 값의 범위에 따라 필요한 바이트 크기가 달라진다. ..
포인터 0. 포인터란? 포인터는 주소 값을 담을 수 있는 변수나 주소값을 의미하는 상수이다. 말 그대로 int변수가 있고 int 상수가 있으면 point변수가 있고 point상수가 있는것이다. 포인터 변수는 주소값을 저장하기 위한 변수이다. 그리고 포인터에는 포인터가 가리키는 메모리에 대한 정보가 포함되 어 있다. 포인터를 이용한 메모리의 접근을 위해서다. 저장된 주소값의 메모리 공간에 대한 정보도 존재. 포인터 변수는 *연산을 통한 메모리의 접근가능 16bit 시스템에서는 이 변수가 2byte(16bit)이다. 2의 16승은 65536이므로 65536개의 주소를 부여할 수 있다. 32bit 시스템에서는 이 변수가 4byte(32bit) 크기 이다. 2의32승은 4294967296개의 주소를 부여 가능, 4기가..
2차원 배열을 함수의 인자로 전달 2차원 배열을 위한 매개변수 선언방식 2차원 배열의 매개변수 선언시 반드시 위와같이 가로의(열) 길이를 명시해서 선언해야한다. 왜냐하면 앞에서도 보았지만 2차원 배열의 요소에 접근(참조 및 변경)하기 위해서는 주소값을 알아 야한다. 그리고 2차원 배열의 주소 계산법에 가로의 길이가 필요하기 때문이다. 아래의 링크를 참고하자 https://cg-developer.tistory.com/185?category=765535
1차원 배열을 함수의 인자로 전달 1. 배열 전달의 기본 원리 함수를 호출하면서 값을 전달할때 배열을 통째로 전달할 수 없다. 즉 배열을 매개변수로 선언하는 방법은 존재하지 않는다. 대신 배열의 주소 값을 전달한다. 12345678910111213141516171819void ArrPrintf(int arg[]); int main(void){ int arr[3]={1, 2, 3}; ArrPrintf(arr); return 0;} void ArrPrintf(int arg[]){ int i; for(i=0; i
2차원 배열의 각 행의 주소 계산법 2차원 배열 int arr[3][4]에서 arr[0], arr[1], arr[2]의 주소 계산법을 봐보자 배열 이름 arr은 그자체가 상수로서 0x10의 값을 지니지만 arr[0],arr[1],arr[2]는 arr을 바탕으로 계산하여 만들어진 상수 값이다. 계산방식은 아래와 같다. 배열 요소를 이루는 변수의 자료형과 배열의 가로 길이가 계산에서 가장 중요한 핵심이다. 배열의 이름은 시작 위치를 의미하고, 인덱스 값, 배열 요소 크기, 가로길이를 이용해서 시작위치로부 터 떨어져 있는 거리를 계산하게 된다.
2차원 배열과 1차원 배열의 관계 1. 관계를 왜 따져야 하는가? 자료형이 같고 길이가 동일한 1차원 배열을 여러개 묶어 놓은 것을 2차원 배열로 볼 수 있지 않을까? 1차원 배열과 2차원 배열은 분명 관계가 있다. 2차원 배열에 저장할 수 있는 문자열의 형태를 이해하고, 포인터를 더 깊이 있게 이해하기 위해 1차원 배열과 2차원 배열의 관계를 따져보자. 2. 1차원 배열 다음 3개의 배열을 선언한다고 가정해보자 int arr1[4]; int arr2[4]; int arr3[4]; 이 때에 메모리 공간에 형성되는 배열의 구조는 다음과 같다. 위 그림에서 배열의 이름 arr1, arr2, arr3는 각 배열의 주소 정보를 담고 있다. arr1, arr2, arr3는 변수와 마찬가지로 이름도 있고 , 주소값도 지니나, 배열의 이름은 변수가 ..