산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C에서 손쉬운 포인터 배열 초기화:팁 및 모범 사례

포인터는 다른 변수의 주소를 저장하는 변수입니다. 포인터 변수의 이름 앞에는 "*" 기호가 와야 합니다. 일반 변수의 경우와 마찬가지로 "포인터 배열"을 선언할 수도 있습니다. 여기서 배열의 각 첨자는 배열 유형의 주소를 보유합니다.

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번째 요소의 주소와 동일)만으로 배열을 탐색할 수 있습니다.

예시 1

다음 예를 살펴보세요 -

#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

예 2:포인터 배열을 사용하여 2D 배열 탐색

이 예에는 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

예 3

여기서 포인터 배열은 실제로 필요하지 않습니다. 이 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 언어

  1. C++ 함수에서 객체를 전달하고 반환하는 방법은 무엇입니까?
  2. C의 포인터와 다차원 배열 마스터하기
  3. C와 C++의 차이점
  4. C - 의사결정
  5. C# 데이터베이스 연결:SQL Server 연결 방법(예시)
  6. 예제가 있는 C 라이브러리의 malloc() 함수
  7. malloc() 대 calloc():예제와 함께 설명된 주요 차이점
  8. C# 식, 문 및 블록(예제 포함)
  9. C# 중첩 클래스
  10. C++의 변수 범위