[포인터와 배열의 관계]
[배열의 이름]
배열의 이름은 첫번째 요소의 주소값을 나타낸다.(주소값이 바뀌면 안되기에 이름은 상수)
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 |