𝗣𝗿𝗼𝗷𝗲𝗰𝘁 𝗔𝗩𝗦

Project AVS Since 2023.01.27

소프트웨어 | Software/프로그래밍 | C언어 | C

내가 보려고 만드는 C언어 정보 모음 #배열 #포인터

아벵 AVS 2023. 4. 25. 19:59

CTRL + F 로 키워드 검색

본 글은 필자가 C언어를 공부하면서 쓰는 일종의 저장 노트입니다.

필자도 배우는 입장으로

필요하신 분 들은 적절히 사용하면 좋을 듯 하다.

이전 편

2023.04.11 - [소프트웨어 | Software/프로그래밍 | C언어 | C] - 내가 보려고 만드는 C언어 정보 모음 #기본

 

내가 보려고 만드는 C언어 정보 모음 #기본

CTRL + F 로 키워드 검색 본 글은 필자가 C언어를 공부하면서 쓰는 일종의 저장 노트입니다. 필자도 배우는 입장으로 필요하신 분 들은 적절히 사용하면 좋을 듯 하다. 비주기적 업데이트 예정 마

avs-won.tistory.com

 

 

비주기적 업데이트 예정

마지막 업데이트 2023 05 03 끝

 1차원 배열


※ 배열의 길이 정보는 상수로 해주는 것이 좋다.

허나 최근에는 상수가 아닌 변수 선언도 허용하나 범용적으로 상수 선언을 권장한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
	int arr1[7]; // 상수로 지정
	int len = 20;
	int arr2[len]; // 변수로 지정
	return 0;
}

 

 char 형의 배열을 선언시 문자열 저장만 아니라 변경도 가능하다.

 

 char형 배열을 선언시 문자열 끝에 "\0"라는 escape sequence(이스케이프 문자)가 있다는걸 명심해야한다.

다른말로 "\0"을  null 이라고도 한다. 

ex: int char[] = "Good" 이라고 선언하면 실제로는 G,o,o,d,\0 이렇게 구성 되어 있다.아스키 코드 값으로 0인 \0 이다.

 

 scanf 로 문자열을 입력 받을때는 %s 를 사용.

다만 문자열을 입력받는 배열의 경우는 배열 앞에 & 연산자를 사용 하면 안된다.

 

 C언어에서 표현하는 모든 문자열 끝에는 널(\0) 문자가 자동으로 삽입된다.

 

※ 문자열 좌우 반전 C언어 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	char arr[100];
	int i,lens=0;
	char temp;
	printf("영어 단어 입력 하세연");
	scanf("%s", arr);
	
	while (arr[lens] != '\0')
		lens++;

	for (i = 0; i < lens/2; i++)
	{
		temp = arr[i];
		arr[i] = arr[(lens-i)-1];
		arr[(lens - i) - 1] = temp;
	}
	printf("좌우반전 문자열 : %s \n", arr);

	return 0;
}

 

 포인터 


 C언어에서 변수는 메모리상에 존재한다. 이 메모리에는 각각의 주소가 있다.

포인터 변수 : 메모리 주소 값을 저장하기 위한 변수

32비트 시스템에서 그 크기는 4바이트 , 64비트 시스템에선 8바이트

 

※ 포인터 변수 선언시 '*'의 위치는 상관 X 

 

포인터 변수 선언 예시 : int * pointer_1;

 

포인터의 형에 주의하라 int형 포인터 변수를 선언 해놓고 double형 변수 메모리 주소값을 주면 아무짝이 쓸모 없다.

 
포인터 선언시 초기화는 필수다. 0이나 NULL로 초기화 하자.


 포인터와 배열


배열의 이름은 포인터이다.

 

포인터와 배열의 차이점을 들어가자.

ㄴ포인터 변수는 주소 값 변경이 가능하나 배열의 이름은 불가능 하다.

 

int * pointer = &arr[0]   이 문장은 

int * pointer = arr 과 같다.

 

Type형 포인터를 대상으로 n만큼 값을 증감시 n x (Type의 크기) 만큼 주소 값이 증감 한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	int array[3] = { 10,20,30 };
	int* pointer = array;
	printf("%d %d %d \n", *pointer, *(pointer + 1), *(pointer + 2));

	printf("%d ", *pointer); pointer++;
	printf("%d ", *pointer); pointer++;
	printf("%d ", *pointer); pointer--;
	printf("%d ", *pointer); pointer--;
	printf("%d ", *pointer); printf("\n");

	return 0;
}

결과

※ arr[i] == *(arr+i) 결론

 

※ char string[ ] = "QWERTY" 변수 형태의 문자열

문자열 전체를 저장

 

char * string_2 = " POWER " 상수 형태의 문자열

문자열 P의 주소 반환

 

배열에 있는 값을 포인터 접근법으로 위치를 바꾸는 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	int arr[6] = { 1,2,3,4,5,6 };
	int* ptr = &arr[0];
	int* ptr_last = &arr[5];
	int temp = 0;

	for (int i = 0; i < 3; i++)
	{
		temp = *ptr;
		*ptr = *ptr_last;
		*ptr_last = temp;
		ptr++, ptr_last--;
	}

	for (int k = 0; k < 6; k++)
		printf("%d ", arr[k]);


	return 0;
}

 

함수 인자 전달 #배열


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void Func(int number)
{
	printf("%d \n", ++number);
}

int main(void)
{
	int k = 1;
	Func(k);

	return 0;
}

 

Func 함수에 k 자체가 아닌 k에 저장된 값을 전달

 

여기서 k는 인자  number은 매개변수다.

 

배열을 인자로 전달하는 법

void Func(int * any) { ..........}혹은void Func(int any[ ] ) {.....} 형태도 가능하다.후자가 좀 더 많이 쓰인다.

 

Call by value //// Call by reference


※ 위 표현은 필자가 대학교 1학년때 다니면서 C언어 전공 수업때 들은 표현이었는데

처음엔 사실 그냥 무시하고 흘려 들었다. (하지만 지금 다시 배울려고 한다.)

 

※ Call by Value : 값을 전달하는 형태

※ Call by reference : 배열,주소값을 전달하는 형태

 

scanf 함수 사용시 &기호의 의미가 이제 뭔지 알 것이다.

바로 주소 값을 나타내는것이다.

 

다만 문자열을 입력받는 

scanf(" %s " , string );

위의 형태는 왜 &를 붙이지 않을까

답은 이미 배웠다. 문자열 자체가 배열의 첫 번째 위치를 나타내는 주소 값이기 때문이다.

 

포인터 변수 const 관계

int * const pointer = &input;

pointer는 상수가 되어서 주소 값이 한 번 저장되면 그 이후로 값을 못 바꿈

 

 

반응형