원시 데이터가 아닌 데이터에 여러 메모리 블록이 필요하기 때문에 포인터의 중요성이 있습니까? 여러 개의 메모리 블록이 필요하고 포인터는 시작 위치에 대한 참조를 효과적으로 제공 한 다음 객체에 필요한 모든 데이터를 수집하는 데 필요한만큼 멀리 갈 수 있습니까?
아니요. 설명하는 것은 배열 의 중요 합니다 .
그렇다면 포인터의 중요성은 무엇입니까?
데이터가 있다고 가정합니다.
12
그 데이터로 무엇을 할 수 있습니까? 저장 위치에 저장하고 나중에 필요할 때 해당 위치에서 가져올 수 있습니다.
int height = 12;
메소드에 값으로 전달할 수 있습니다.
doit(12);
다른 값과 같은지 비교할 수 있습니다.
if (height == 13)
그리고 몇 가지 다른 것들도 있지만 이것들은 큰 것들 중 일부입니다.
음, 포인터도 마찬가지입니다. 포인터는 값이므로 저장, 가져 오기, 전달 및 비교할 수 있습니다. 그러나 주소 지정이 가능한 저장 위치는 포인터로 바뀔 수 있습니다. 이것이 바로 C 포인터의 힘입니다 . 다른 데이터처럼 저장 위치를 다룰 수 있습니다.
-------------------num은 여전히 특정 메모리 주소의 값을 가리 킵니다.
아니요, num
은 포인터가 아니기 때문 입니다. 나는 여기에서 콩을 세고 있지만 그것은 당신의 아이디어를 올바르게 얻는 데 중요합니다. 변수를 정의 할 때 num
컴파일러 num
는 변수가 범위에있는 한 유효하게 유지되는 메모리 주소에 이름 을 할당합니다 . 전체 프로그램에 대해 전역 변수 인 경우 또는 함수가 반환 될 때까지 지역 변수에 대해 유효합니다.
예를 들어, 구조는 많은 요소로 구성 될 수 있습니다. 그리고 뭔가
char c[100]="string"
완벽하게 유효합니다. 관련된 포인터가 없습니다 (아직).
포인터가 필요한 이유 중 하나는 함수를 호출 할 때입니다. 일반적으로 함수의 모든 매개 변수는 값으로 호출됩니다. 그래서 기능이 있다면
무효 스왑 (int x, int y) {int temp = x; x = y; y = temp; }
그리고 그것을 불러
int a=3;
int b=5;
swap(a, b);
printf("%d %d\n", a, b);
당신은 출력 값 3과 5를 얻게 될 것입니다-변수는 분명히 바뀌지 않았습니다. 그 이유는 컴파일러가 변수의 복사본을 만들고 복사본을 스왑에 전달하기 때문입니다.
당신은 컴파일러에게하고 싶은 경우 이제 "나는 내가 스왑 내가 명명하는 메모리 위치를 변경하려면, 복사본을하지 않으려 a
하고 b
, 당신이 포인터가 필요합니다"
무효 스왑 (int * x, int * y) {int temp = * x; * x = * y; * y = temp; }
int a=3;
int b=5;
swap(&a, &b);
printf("%d %d\n", a, b);
&
연산자는 컴파일러 "나는 내가 그 메모리 주소에 쓴하는 값이 아닌 이름있는 메모리 주소를 원한다"을 알려줍니다. 스왑 함수 내에서 *
의미는 "x는 내가 원하는 값이 아니라 내가 정말로 바꾸고 싶은 메모리의 주소입니다-나를 호출 한 함수에 속한 변수"입니다. 파스칼과 같은 다른 프로그래밍 언어는 이것을 "참조로 호출"이라고 부르고 C에서는 "값으로 호출"이라고 부릅니다.
이제 언어 에 포인터가 있습니다. 문자열과 배열을 재고 해 봅시다.
내가 함수를 호출하면
myfunction("Thisisaverylongstringthatjustwontendnoway....")
값에 의한 호출은 호출자에서 수신자에게 많은 바이트를 복사해야하므로 비효율적입니다. 따라서 C의 디자인 결정 중 하나는 다음과 같습니다.
함수가 다른 함수를 호출 할 때마다 배열을 매개 변수로 전달하면 배열이 값으로 전달되지 않고 대신 배열의 시작 부분에 포인터를 자동으로 전달하여 참조로 호출합니다.
따라서 함수 호출에서 배열 (및 문자열은 배열의 특별한 경우)은 항상 포인터로 전달됩니다. 그렇기 때문에 C에서 포인터에 대해 곧 배워야합니다. Pascal에서 훨씬 더 오래 지낼 수 있습니다. 또는 Java (뒤에서 오브젝트로 작업 할 때 항상 포인터로 작업하지만 Java는이를 숨 깁니다).
그리고 이것이 C를 배울 때 배열과 문자열 직후에 포인터가 자주 도입되는 이유입니다. 함수가 무엇인지, 배열 또는 문자열이 무엇인지 아는 즉시 포인터 또는 함수와 배열을 함께 얻지 못할 것입니다.
"다중 메모리 블록"에 대한 마지막 문장은 몇 바이트보다 큰 것은 포인터가 필요하다는 점에서 정확하지 않습니다. 구조는 그렇지 않습니다.하지만 대부분의 경우 프로그램은 포인터를 사용하면 더 빠릅니다. 각각 100 바이트 길이의 두 개의 문자열이 있고이를 교체하려면 많은 복사 작업을 수행해야합니다. 그냥 훨씬 빠른 포인터입니다 교환 이렇게 빨리 당신이 더 큰 개체를 상대하고, 당신이, (일반적으로, 포인터는 4-8 바이트 필요) 원하는 포인터가 효율성을 이유로, 그들을 가리키는 처리 할 수 있습니다.
이제는 동적 메모리 할당을 시작하지도 않았지만 .. 내 대답은 이미 충분히 큰 것 같습니다.
출처
https://stackoverflow.com/questions/22080009