반응형
1차원 배열과 포인터에 대해 설명합니다.
배열은 메모리상에 연속적으로 공간을 확보하고 있어서, 포인터를 이용해서 배열의 원소를 다루기 쉽습니다.
포인터를 배열처럼 다룰 수 있으며, 배열을 포인터처럼 다룰 수도 있습니다.
다음과 같은 1차원배열의 선언을 살펴보겠습니다.
int a[5] = { 1, 2, 3, 4, 5}; |
[암기] 배열명은 해당 배열의 시작주소를 나타냅니다.
이 배열의 시작주소는 다음과 같이 표현할 수 있습니다.
a &a[0] &a |
주의할 점은 a와 &a의 시작 주소는 같지만, 그 의미는 서로 다릅니다.
&a는 배열 전체의 시작주소라 말할 수 있습니다. 그래서 &a+1의 주소는 배열 전체의 크기 다음 위치를 나타냅니다.
a+1과 &a+1의 주소가 다름에 주의하여야 합니다.
배열명은 배열의 시작주소이므로 다음과 같은 연산이 가능하거나 불가능합니다.
a a+1 a+2 a++ -- 배열명으로 ++ 연산은 불가능합니다. --a -- 배열명으로 -- 연산은 불가능합니다. |
배열의 시작 주소와 a+1, &a+1의 주소 출력
#include <stdio.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
printf("%p\n", a);
printf("%p\n", &a);
printf("%p\n", a + 1);
printf("%p\n", &a+1);
return 0;
}
예제
다음 예제는 배열 이름을 (포인터처럼 사용) 사용해서 배열의 각 원소의 주소와 값을 출력하는 예제입니다.
#include <stdio.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
int i;
for (i = 0; i < 5; i++)
printf("%p %d\n", a + i, *(a + i));
return 0;
}
*p++는 포인터 p의 값(*p)을 사용하고, 포인터를 1 증가하는 식입니다.
*p++; 위 코드는 아래 2줄과 동일합니다. *p; p++; |
예제
#include <stdio.h>
int main()
{
char s[] = "Hello, C";
char* p = s;
while(*p)
printf("%c\n", *p++);
return 0;
}
예제
#include <stdio.h>
int main()
{
char s[] = "Hello, C";
char* p = s;
while(*p)
printf("%s\n", p++);
return 0;
}
배열을 함수의 매개변수로 사용하기
다음 예제는 매개 변수로 배열을 받아서, 포인터처럼 사용하는 예제입니다.
#include <stdio.h>
void print(int a[], int size)
{
int i;
for(i=0; i<size; i++)
printf("%d ", *(a + i));
printf("\n");
}
int main()
{
int a[5] = { 1,2,3,4,5 };
print(a, 5);
return 0;
}
다음 예제는 함수의 매개변수에서 배열을 포인터로 받아서 배열처럼 사용하는 예제입니다.
#include <stdio.h>
void print(int *a, int size)
{
int i;
for(i=0; i<size; i++)
printf("%d ", a[i]);
printf("\n");
}
int main()
{
int a[5] = { 1,2,3,4,5 };
print(a, 5);
return 0;
}
반응형
'C_C++' 카테고리의 다른 글
(C/C++) main() 함수의 인수, 명령행(command line) 인수 (0) | 2022.11.07 |
---|---|
(C언어) 오일러 수, 자연로그 밑수 (0) | 2022.11.07 |
(C언어) 문자열 복사 mystrcpy 함수 만들기 (0) | 2022.11.06 |
(C언어) 문자열 결합 mystrcat 사용자 정의 함수 만들기 (0) | 2022.11.06 |
(C언어) 문자열 길이 mystrlen 함수 만들기 (0) | 2022.11.06 |