2012-12-22 2 views
0

나는 내가 원하는 값을 가리 키도록 포인터의 포인터를 증가시키는 방법을 알아 내려고하고있다. 이것은 본질적으로 cstrings에 대한 포인터 배열이며 xx 포인터를 가리 키도록 포인터를 증가시키고 자합니다. 내 현재 응용 프로그램의 주장을 위해 나는 (포인터가 char **pointer로 정의된다)포인터의 포인터 증가시키기

*pointer++; 
*pointer++; 
*pointer++; 
*pointer++; 
*pointer++; 

내가 할 수있는 다섯 번째 포인터를 가리 키도록하려는 경우와 나는 지금 내가 원하는 *pointer[0]에 다섯 번째 포인터를 설정합니다. 나는 이것을 희망적으로 1 개의 라이너로 정리하는 방법을 찾고 있습니다. 이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 아직 해결 방법을 찾지 못했습니다. 마지막 시도는

*pointer += (sizeof(pointer) * 5); 

이었지만 작동하지 않았습니다. 나는 만약 내가 시스템 (4 바이트)에 포인터의 크기를 얻었고 포인터의 수를 곱하면 그것을 스윕하는 것과 똑같이 할 것이라고 생각했다. *pointer++ 호출. 포인터를 끝내기 전까지 포인터를 증가시킨 후 다음을 사용하여 나머지 cstring을 printf합니다.

while(*pointer[0]) 
{ 
    printf("data: %s\n", *pointer); 
    pointer++; 
} 

은 전반적으로 나는 1 라이너로 5 *pointer++; 전화를 돌려 도움이 필요합니다. 컴파일러는 뾰족한 물체의 크기를 파악하고 :

pointer += 5; 

이 C에서 잘, 그것은 포인터 연산라고 : 당신이 5하여 포인터를 증가하려면

+0

'포인터 ++;'는 당신이 생각하는대로하지 않습니다. 더더욱, 당신은 sizeof (* p)를 수동으로 곱할 필요가 없다; 포인터 산술 및 컴파일러가 당신을 위해 작동합니다. –

+0

''char * ptr = pointer + 5;''와''ptr''을 조작 할 수 있습니까? – fge

답변

2

, 단순히 그것을 할 적절한 수의 주소 지정 가능 단위가 추가됩니다. 5에 포인터 크기를 곱하면 결과가 예상 한 것과 같지 않습니다. 플랫폼의 포인터 크기가 4 인 경우 결과는 5 대신에 20만큼 증가합니다.

증가 연산자는 포인터로 마술을하지 않으며 단지 1을 추가하는 것입니다.

더욱이 *pointer++이 정말로 당신이 생각하는대로하고 있습니까? 증가분은 역 참조 연산자보다 우선 순위가 높습니다. 이 두 문장은 같은 효과가 있습니다 모두 진술에서

*pointer++; 

pointer++; 

(증가가 접미사이기 때문에, 이전 값) 첫 번째 또한 포인터 역 참조에, 증가 포인터를하고하지 않고, 그것이 가리키는 것을 가지고 그것으로 무엇이든 할 수 있습니다. 당신이 표현의 내부를 사용하는 경우

그들은 당신에게 다른 두 가지를 제공합니다 : pointerchar ** (이것은 문자열의 배열입니다 랬) 입력이있는 경우, *pointer++는 첫 번째 문자에 대한 포인터로 당신에게 첫 번째 문자열을 제공 다음pointer을 증가시키는 반면, 의 결과는 여전히 char **이고 단순히 pointer 자체 을 반환하고 증분을 pointer 증가시킵니다. 두 경우 모두 첫 번째 문자열을 잃어 버리는 것을주의하십시오.

나는 linux 태그를 보았습니다. 플랫폼에 대해 생각할 필요가 없습니다. 이식성이 있습니다.당신이 유형 TYPE*의 포인터 pointer이 있고 N을 추가하는 경우

+0

고맙습니다. 그것에 대해 생각한 후에 조금 더 깨달았지만 잘못 이해하고 있었지만 아직도 이해하지 못합니다. 문제는 내가'포인터 ++ '대신'포인터 ++'를 증가 시켜서'pointer [0]'를 5 번째 포인터가되도록 설정했기 때문에 내가 원했던 것보다 먼저 다른 포인터를 "두드리는"대신에 설정했다. '** pointer'를 출력하기 위해서는 [5]에서 시작하는 대신 [0]을 가진 모든 요소들을 출력 할 것입니다. 이해할 수없는 점은 당신이 빨리 설명 할 수 있다면'char ** pointer'에서'pointer ++'와'pointer ++'의 차이점입니다. –

+0

@randynewfield 그것에 대해 뭔가를 추가했습니다. – effeffe

1

는 다음 포인터가 N * sizeof (*pointer) 또는 이에 상응하는 N * sizeof(TYPE) 바이트로 진행됩니다. 메모리가 동적으로 할당 된 경우 언급하지 않았으므로 포인터가 전진 한 후에 free() 메모리를 시도 할 때 정의되지 않은 동작이 발생합니다. 할당 된 바이트의 수 또는 가리키는 현재 주소를 의미합니다.

+0

좋은 점, +1 코너 경우 – effeffe

관련 문제