본문 바로가기

C

13강 . 포인터와 배열

[포인터와 배열의 관계]

[배열의 이름]

배열의 이름은 첫번째 요소의 주소값을 나타낸다.(주소값이 바뀌면 안되기에 이름은 상수)

int 형은 배열요소간 주소값이 4 씩 ,double 은 8씩 차이난다.

int main(void)
{

    int a[5]={0, 1, 2, 3, 4};

    printf("%d, %d \n", a[0], a[1]);				//배열 요소 출력.

    printf("%d 번지 , %d 번지 \n", &a[0], &a[1]);	//배열 요소의 주소 출력.

    printf("배열 이름 : %d \n", a);					//배열 이름 출력.

}

 

[배열의 이름과 포인터 비교]

배열의 이름은 상수 / 포인터는 변수이다. 공통점은 메모리의 주소를 나타내고 이름이 존재한다는 점이다.

int main(void)
{
    int a[5]={0,1,2,3,4,5};
    int b=10;
    a=&b;	//a는 상수이기에 오류이다
}

[배열의 이름의 활용]

배열 이름을 포인터처럼 , 포인터를 배열 이름처럼 활용이 가능하다

int main(void)
{
    int a[]={0,1,2,3,4,5};
    int * b= a;
    printf("%d",b[0]);	//포인터를 배열처럼
}

[포인터 연산]

포인터가 지니는 값을 증가 혹은 감소시킨다 (나누기 곱하기는 없다)

빠르지만 위험한 연산이며 , 포인터가 가리키는 대상에 따라 증가/감소되는 값이 다르다.

int main(void)
{

	int arr[5] = { 1, 2, 3, 4, 5 };
	
		int* pArr=arr;
	
		printf("%d \n", pArr);
	
		printf("%d \n", (++pArr));
		printf("%d \n", (++pArr));	//
		printf("%d \n", (pArr ));	//위와 같은 값

		printf("%d \n", (pArr+1));	//원래 주소값 +4
		printf("%d \n", (pArr+2));	//원래 주소값 +8
	
		return 0;

}

[문자열 상수를 가리키는 포인터]

문자열 상수를 가리키기 때문에 값을 바꾸지 못한다.

int main()
{
	char str1[5]="abcd";		// 문자열 변수 선언
	const char *str2="ABCD";			// 문자열 상수 선언.const  키워드 없다면 에러

	printf("%s \n", str1);
	printf("%s \n", str2);
	
	str1[0]='x';				// 문자열 변수 변경, 따라서 OK!
//  str2[0]='x'; //Error 발생!	// 문자열 상수 변경, Error 발생!
	/*
		윈도우즈에서 VC++ 컴파일한 후 실행하게 되면 런타임 오류 메시지를 보게된다.
		그러나 컴파일러에 따라서 위에 줄을 그냥 허용하는 경우도 있다.(TURBO C/C++ 컴파일러등..)
		이는 분명히 잘못된 연산이다. 따라서 윗 줄과 같은 코드는 컴파일러가 허용한다 하더라도 작성하지 말자.
	*/

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

    return 0;
}

[const 키워드의 사용]

const char* a = "ABCD";//데이터 상수화 : a가 가리키는 값은 상수이다
char*  const b = "ABCD";//포인터 상수화 : a는 다른 데이터 참조가 불가하다

[포인터 배열]

배열의 요소로 포인터를 지니는 배열

int * arr1[10];	//int 형 포인터 10개를 저장하는 배열 arr1
#include<iostream>
int main(void)
{
	const char* a[] = {"asd","sdf","asdasdas"};
	printf("%s\n", a[0]);	//%s는 주소값을 받아  null이 나올때까지 문자열 출력
	printf("%s\n", a[1]);
	printf("%s\n", a[2]);
}

'C' 카테고리의 다른 글

16장 . 다차원 배열  (0) 2023.01.08
14강 . 포인터와 함수에 대한 이해  (0) 2023.01.05
12장. 포인터의 이해  (0) 2023.01.05
11장 . 1차원 배열  (0) 2023.01.05
9장 . C언어의 핵심 함수  (0) 2023.01.02