C 언어
포인터는 다른 변수의 주소를 저장하는 변수입니다. 포인터 변수의 이름 앞에는 "*" 기호가 와야 합니다. 일반 변수의 경우와 마찬가지로 "포인터 배열"을 선언할 수도 있습니다. 여기서 배열의 각 첨자는 배열 유형의 주소를 보유합니다.
포인터 변수는 선언 시 기존 변수의 주소를 할당하여 초기화할 수 있습니다. 다음 조각은 포인터를 초기화하는 방법을 보여줍니다 -
int x = 10; int *y = &x;
기본적으로 포인터 변수를 포함한 모든 변수는 "자동 저장 클래스"에 속합니다. 이는 포인터 변수가 예측할 수 없는 쓰레기 임의 메모리 주소를 저장하여 정의되지 않은 동작과 분할 오류 오류와 같은 프로그램에 대한 잠재적인 위험을 초래할 수 있음을 의미합니다. 따라서 선언 시 저장할 특정 값이 없으면 NULL로 초기화해야 합니다.
int *ptr = NULL;
"포인터 배열"은 각 요소의 주소를 저장합니다. 배열의 유형은 대상 변수의 유형과 일치해야 합니다.
또한 static 키워드를 사용하여 포인터 배열을 초기화하여 각 첨자에 "0"을 저장할 수도 있습니다.
#include <stdio.h>
int main(){
static int *ptr[5];
for (int i = 0; i < 5; i++){
printf("ptr[%d] = %d\n", i, ptr[i]);
}
return 0;
}
코드를 실행하고 출력을 확인하세요 -
ptr[0]= 0 ptr[1]= 0 ptr[2]= 0 ptr[3]= 0 ptr[4]= 0
여기서는 정수 포인터 배열을 선언하고 세 개의 정수 변수의 주소를 저장합니다.
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
int *ptr[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
코드를 실행하고 출력을 확인하세요 -
ptr[0]: address: 6422040 value: 10 ptr[1]: address: 6422036 value: 20 ptr[2]: address: 6422032 value: 30
포인터 배열의 해당 요소에 일반 배열의 각 요소의 주소를 저장할 수 있습니다.
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr[3] = {&arr[0], &arr[1], &arr[2]};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
코드를 실행하고 출력을 확인하세요 -
ptr[0]: address: 6422032 value: 10 ptr[1]: address: 6422036 value: 20 ptr[2]: address: 6422040 value: 30
배열의 기본 주소(이 경우 "&arr[0]")를 얻을 때 포인터가 데이터 유형의 크기만큼 증가한다는 것을 알고 후속 요소의 주소를 얻을 수 있습니다.
따라서 기본 주소(배열의 이름은 0번째 요소의 주소와 동일)만으로 배열을 탐색할 수 있습니다.
다음 예를 살펴보세요 -
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr=arr;
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i,ptr+i, *(ptr+i));
}
return 0;
}
코드를 실행하고 출력을 확인하세요 -
ptr[0]: address: 6422020 value: 10 ptr[1]: address: 6422024 value: 20 ptr[2]: address: 6422028 value: 30
이 예에는 2D 배열이 있습니다. 각 행의 0번째 요소의 주소는 포인터 배열에 저장됩니다. 순회할 때 해당 행의 0번째 요소를 가리키는 포인터 배열의 각 요소에 저장된 주소는 각 행의 값을 가져오기 위해 각각 증가합니다.
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int (*ptr)[4] = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", *(ptr[i]+j));
}
printf("\n");
}
return 0;
}
이 코드를 실행하면 다음과 같은 출력이 생성됩니다.
1 2 3 4 5 6 7 8
여기서 포인터 배열은 실제로 필요하지 않습니다. 이 2D 배열의 이름을 기본 포인터로 사용할 수 있고 행 및 열 단위로 증가시켜 주어진 2D 배열의 요소를 가져올 수 있기 때문입니다. −
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int *ptr = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++){
for (j = 0; j < COLS; j++){
printf("%d ", *(ptr + i * COLS + j));
}
printf("\n");
}
return 0;
}
출력은 이전 코드의 출력과 유사합니다 -
1 2 3 4 5 6 7 8
C 프로그래밍에서 문자열은 char 데이터 유형의 배열입니다. 배열의 이름은 0번째 요소의 주소도 나타내므로 문자열은 −
로 선언할 수 있습니다.char arr[] = "Hello";
포인터 표기법을 사용하여 문자열은 char 포인터에 −
로 할당됩니다.char *arr = "Hello";
그런 다음 다음과 같이 여러 문자열을 저장하기 위해 char 포인터 배열을 선언할 수 있습니다. −
char *arr[3] = {"string1", "string2", "string3", . . . };
다음 예에는 컴퓨터 언어의 이름을 저장하는 데 사용되는 char 포인터 배열이 있습니다.
#include <stdio.h>
int main(){
char *langs [10] = {
"PYTHON", "JAVASCRIPT", "PHP",
"NODE JS", "HTML", "KOTLIN", "C++",
"REACT JS", "RUST", "VBSCRIPT"
};
for(int i = 0; i < 10; i++)
printf("%s\n", langs[i]);
return 0;
}
이 코드를 실행하면 다음과 같은 출력이 생성됩니다.
PYTHON JAVASCRIPT PHP NODE JS HTML KOTLIN C++ REACT JS RUST VBSCRIPT
이 프로그램에서 "langs"는 10개의 문자열 배열에 대한 포인터입니다. 따라서 "langs[0]"이 주소 5000을 가리키는 경우 "langs + 1"은 두 번째 문자열에 대한 포인터를 저장하는 주소 5004를 가리킵니다.
따라서 다음과 같은 루프 변형을 사용하여 문자열 배열을 인쇄할 수도 있습니다. −
for (int i = 0; i < 10; i++){
printf("%s\n", *(langs + i));
}
malloc() 함수를 사용하여 동적인 방식으로 포인터 배열을 선언하고 초기화할 수 있습니다.
다음 예를 살펴보세요 -
#include <stdio.h>
int main(){
int *arr = (int *)malloc (sizeof (int) * 5);
for(int i = 0; i < 5; i++){
arr[i] = i;
}
for (int x = 0; x < 5; x++){
printf("%d %d\n", x, arr[x]);
}
return 0;
}
이 코드를 실행하면 다음과 같은 출력이 생성됩니다.
0 0 1 1 2 2 3 3 4 4
사용자 입력을 요청하고 배열 포인터의 요소에 값을 할당할 수도 있습니다. −
for(i = 0; i < 5; i++){
scanf("%d", &x);
arr[i] = x;
}
C 언어