Search
Duplicate

포인터와 배열의 차이(?)

간단소개
포인터와 배열의 차이점에 관한 내용들입니다
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Scrap
태그
9 more properties
안녕하세요! 5기 gulee 입니다. 포인터와 배열의 그 차이에 관해서 제가 아는 정보를 알려드리고자 적게 되었습니다.
대부분의 경우엔 배열과 포인터는 동일하게 처리 가능
아닌 경우도 있다

포인터와 배열의 속도 차이

[index] 계산

#include <stdio.h> int sum(int *num, int end) { size_t index; int result = 0; for (index = 0; index < len, ++index) { result += num[index]; } return (result); } int main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int result; result = sum(a, 10); printf("%d\n", result); return (0); }
C
복사

*temp++ 계산

#include <stdio.h> int sum(int *num, int *end) { int *temp = num; int result = 0; while (temp < end) { result += *temp++; } return (result); } int main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int result; result = sum(a, a + 10); printf("%d\n", result); return (0); }
C
복사

위 두 코드를 봤을때 둘 중 빠른 코드는?

두 코드 중에서 빠른 코드는 아래 *temp++; 코드 이다. 그 이유는?
배열 [ ] 은 언제나 첫 주소를 가서 그 주소에서 +를 해서 그 요소의 위치까지 이동을 한다
포인터 *temp++ 는 이미 다음 주소로 이동해서 오프셋을 하기 때문에 배열보다 빠르다고 할 수 있다
하지만 사실 개미 눈꼽만큼의 차이일 것이다...!

sizeof 연산자에서의 차이

int nums[3] = { 1, 10, 100 }; int* ptr = nums; size_t size1 = sizeof(nums); /* 12 = 3 * 4 */ size_t size2 = sizeof(ptr); /* 4 */
C
복사
sizeof(배열)과 sizeof(포인터)는 다른 값을 반환
sizeof(배열) : 배열의 총 크기를 반환
sizeof(포인터) : 포인터의 크기를 반환
그 이유는?
포인터는 진짜 주소만 저장하고 있기 때문이다.
위를 예로 하자면 ptr은 nums[0]번째 주소를 가지고 있기 때문이다.

문자열 초기화

방법 1

char school1[] = "42seoul";
C
복사
배열에 차례대로 저장이 되고 마지막에 널문자(’\0’)가 들어가고, 함수 안에서 이렇게 배열을 선언하고 초기화하게 된다면 스택 메모리에 저장이 된다.

방법 2

char* school2 = "42seoul";
C
복사
포인터 변수는 스택에 저장이 되고 실제 문자열은 데이터 섹션에 저장이 된다.
그래서 문자열을 수정할 수가 없다. 수정할 경우 ‘결과가 정의되지 않음’에러가 나온다. 그래서 이렇게 할 경우 읽기전용이라고 할 수 있다.

대입

int* ptr1; int* ptr2; int arr1[5]; int arr2[5]; int x = 5; ptr1 = arr1; arr1 = ptr1; /* 컴파일 오류 */ ptr1 = &x; arr1 = &x; /* 컴파일 오류 */ ptr1 = ptr2; arr1 = arr2; /* 컴파일 오류 */
C
복사
포인터 변수에는 주소 값을 대입할 수 있고, 배열 변수에는 대입할 수 없다.
배열은 한번 만들어지면 주소가 고정이 된다. 그래서 그 주소를 바꿀 수가 없다..!!

포인터 산술 연산

++ptr; --ptr; ptr += 1; ptr -= 1; ++arr; /* 컴파일 오류 */ --arr; /* 컴파일 오류 */ arr += 1; /* 컴파일 오류 */ arr -= 1; /* 컴파일 오류 */
C
복사
포인터는 산술 연산{후위연산자(++, - -), 전위연산자(++, - -) 등} 가능하다. 하지만 배열은 불가능하다!
배열의 주소를 증가하거나 감소하고 싶다면 포이니터 배열의 주소를 대입 후 그 포인터 변수를 증가/감소 하면 된다.
그리고 우리가 자주 사용하듯이 [ ] index를 계산을 해도 된다!