본문 바로가기

게임프로그래밍 개발 수업/C언어 수업

C언어 수업 포인터와 배열

23-03-30 수업 내용입니다.

 

사용한 사진 및 자료의 출저는 윤성우의 열혈C 프로그래밍 입니다.

====== 오렌지 미디어 ====== (orentec.co.kr)

 

====== 오렌지 미디어 ======

 

 

#include<stdio.h>

int main()
{
	int arr[3] = { 0,1,2 };
	printf("배열의 이름: %d \n", *arr);
	printf("첫 번째 요소: %p \n", &arr[0]);
	printf("두 번째 요소: %p \n", &arr[1]);
	printf("세 번째 요소: %p \n", &arr[2]);
	
	/*arr = &arr[1];*/

	return 0;

}

이름의 값을 따오게 되면 첫번째 값이 나온다 (*) 가 붙으면 값을 참조함

*arr = 0

*(arr+1) = 1

*(arr+2) = 2

 

 

 

 

#include<stdio.h>

int main()
{
	int arr1[3] = { 1,2,3 };
	double arr2[3] = {1.1, 2.2, 3.3};

	printf("%d %g \n", *arr1, *arr2);
	*arr1 += 100;
	*arr2 += 120.5;
	printf("%d %g \n", arr1[0], arr2[0]);
	return 0;

}

출력 결과

*포인터 값에 연산을 할 경우 값에 연산이 들어간다. 이것은 배열에도 그대로 적용 된다. 배열의 이름이 곧 포인터 이기 때문에 그렇다.

*배열이름 = 배열의 첫번째 자리 값이다.

*(배열이름+n) =배열의 (n+1)번째 자리 값이다.

 

 

 

#include<stdio.h>

int main()
{
	int arr[3] = { 15, 25, 35 };
	int* ptr = &arr[0]; // int*ptr=arr;과 동일한 문장이다.

	printf("%d %d \n", ptr[0], arr[0]);
	printf("%d %d \n", ptr[1], arr[1]);
	printf("%d %d \n", ptr[2], arr[2]);

	printf("%d %d \n", *ptr, *arr);

	return 0;

	//중요한 사실 : 포인터가 배열의 첫번째 주소를 알기 시작하면 포인터는 배열처럼 동작한다.
}

결과창

6행에서 선언한 문장에서 int ptr이라는 포인터가 arr배열의 첫번째 주소값을 알게 되었다.

그때부터 포인터는 아무런 말없이 자동으로 배열처럼 동작한다.

 

 

 

#include<stdio.h>

int main()
{
	int* ptr1 = 0x0010;
	double* ptr2 = 0x0010;
	printf("%p %p \n", ptr1 + 1, ptr1 + 2);
	printf("%p %p \n", ptr2 + 1, ptr2 + 2);
	printf("%p %p \n", ptr1, ptr2);
	ptr1++;
	ptr2++;
	printf("%p %p \n", ptr1, ptr2);
	return 0;
}

포인터 변수에 저장된 값을 대상으로 하는 증가 및 감소 연산을 진행할 수 있다.

곱셈이나 나눗셈 등은 불가능하다.

이 연산도 포인터 연산의 일종이다.

 

 

#include<stdio.h>

int main()
{
	int arr[3] = { 11, 22, 33 };
	int* ptr = arr;
	printf("%d %d %d \n", *ptr, *(ptr + 1), *(ptr + 2));

	printf("%d ", *ptr); ptr++;	//printf함수 호출 후 ptr++실행
	printf("%d ", *ptr); ptr++;
	printf("%d ", *ptr); ptr--;
	printf("%d ", *ptr); ptr--;
	printf("%d ", *ptr); printf("\n");
	return 0;
}

 

 

 

#include<stdio.h>

int main()
{
	char str1[] = "My String";
	char* str2 = "Your String";

	printf("%s %s \n", str1, str2);

	str2 = "Our String"; //가리키는 대상 변경
	printf("%s %s \n", str1, str2);

	str1[0] = 'X';	//문자열 변경 성공
	//str2[0] = 'X';	//문자열 변경 실패 구동해보면 에러가 난다.

	printf("%s %s \n", str1, str2);
	return 0;
}

str2[0]을 변경하려는 것 자체가 에러다. 

포인터가 변수(배열)가 아닌, 상수 형태를 참조하고 있기 때문에

str2[0]을 변경하려 하면 에러가 나는것

 

 

#include<stdio.h>

int main()
{
	//포인터 배열의 이해
	int num1 = 10, num2 = 20, num3 = 30;
	int* arr[3] = { &num1, &num2, &num3 };
	printf("%d \n", *arr[0]);
	printf("%d \n", *arr[1]);
	printf("%d \n", *arr[2]);

	return 0;


}

 

 

문제1 답

더보기

for문을 통해 

#include<stdio.h>

int main()
{
	int arr[5] = { 1,2,3,4,5 };

	int* ptr = &arr[0];

	for (int i = 0; i < 5; i++)
	{
		ptr[i] += 2;
		printf("%d \n", ptr[i]);
	}

	

	return 0;
}

문제3 답

더보기
#include<stdio.h>

int main()
{
	int arr[5] = { 1,2,3,4,5 };

	int* ptr = &arr[4];

	int sum = 0;

	for (int i = 0; i < 5; i++)
	{
		sum += *(ptr--);
	}
	printf("합계: %d \n", sum);



	

	return 0;
}

문제4 답

더보기
#include<stdio.h>

int main()
{
	int arr[6] = { 1,2,3,4,5,6 };
	int* fptr = &arr[0];
	int* lptr = &arr[5];
	int temp;
	
	for (int i = 0; i < 3; i++)
	{
		temp = *fptr;
		*fptr = *lptr;
		*lptr = temp;
		fptr++, lptr--;
	}
	for (int i = 0; i < 6;  i++)
		printf("%d ", arr[i]);
}

 

글자의 순서를 바꾸는 과정을 진행 해보자