반응형
포인터
- 포인터 : 주소값을 저장하기 위한 변수
- 포인터 size : 4byte(32bit), 8byte(64bit)
- 포인터형 : (자료형)* 변수명
※ 포인터형도 자료형 범주에 포함시키기도 한다.
※ *연산자의 위치는 상관없다.
※ 포인터에 형이 없으면 *연산을 통한 메모리 접근은 불가능하다.
- 포인터 변수의 자료형은 해당 주소의 자료형과 동일해야 한다.
- 포인터의 형이 존재하는 이유는 메모리 공간을 참조하는 기준이 된다.
※ int* ptr : 해당 변수에 저장되어있는 주소값으로 가서 sizeof(int)(4byte)를 읽어들여 정수로 해석한다.
- NULL 포인터 : 아무데도 가리키지 않는다.
※ int* ptr = 0 or NULL
#include<stdio.h>
void main()
{
int a = 10;
int* ptr = &a;
//ptr은 주소값을 가지므로 ptr == &a
printf("var a address : %p, pointer ptr value : %d", ptr, *ptr);
}
배열
- 배열의 이름은 포인터이다.
※ 단, 값을 바꿀 수 없는 '상수 형태의 포인터'이다.
※ 배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 *연산이 가능하다.
포인터 변수 | 배열 이름 | |
이름 유무 | 유 | 유 |
저장하는 값 | 주소 값 | 주소 값 |
주소 값 변경 가능한가? | 가능(변수) | 불가능(상수) |
- 포인터 변수를 배열로 사용하기
#include<stdio.h>
#define MAX 3
void main()
{
//포인터에 배열의 이름을 넣어 배열처럼 사용 가능
int arr[3] = {0, 1, 2};
int* ptr = arr or &arr[0];
for(int i = 0; i < MAX; i++)
{
ptr[i] += 1;
printf("%d", ptr[i]);
}
//결과 1 2 3
}
- 배열의 다른 표현방법
#include<stdio.h>
#define MAX 3
void main()
{
int arr[3] = {0, 1, 2};
int* ptr = arr or &arr[0];
for(int i = 0; i < MAX; i++)
{
*(ptr + i) += 1;
printf("%d", *(ptr + i));
}
//결과 1 2 3
}
※ int형 포인터를 대상으로 1을 증가시키면 4가 증가한다.
※ int 형 포인터를 대상으로 +-n => +-n * sizeof(int)
※ 결론 arr[i] == *(arr + i)
- 활용
#include<stdio.h>
//배열도 포인터이기 때문에 인수를 char str[]로 사용해도 무방하다.
void ConvertLowercase(char* str)
{
for (int i = 0; str[i] != NULL; i++)
if (str[i] >= 'A' && str[i] <= 'Z')
str[i] += 32;
}
void main()
{
char arr[3] = "AB";
ConvertLowercase(arr);
printf("%s", arr);
//결과 ab
}
※ char 배열의 마지막은 NULL(\0)로 채워지므로 for문 조건문에 NULL을 사용할 수 있다.
포인터 배열
- 포인터 변수로 이뤄진, 주소 값의 저장이 가능한 배열을 가리킨다.
#include<stdio.h>
#define MAX 3
void main()
{
int a = 10, b = 20, c = 30;
int* arr[3] = {&a, &b, &c};
for(int i = 0; i < MAX; i++)
printf("%d", *arr[i]);
//결과 10 20 30
}
반응형
'Stack > C' 카테고리의 다른 글
C 중간 활용 : 학생 관리 시스템 만들기 (0) | 2021.08.24 |
---|---|
C 파일 입출력 (0) | 2021.08.24 |
C 구조체, 구조체 포인터 (0) | 2021.08.22 |
C 동적할당 (0) | 2021.08.22 |