2012-11-07 4 views
2

문자열 배열의 주소 지정과 관련된 특정 항목에 대한 설명을 찾고 있습니다. 몇 가지 관련 문제가있는 것으로 보이지만 내 질문에 대해 논의한 것을 찾을 수 없었습니다. 이 질문이 나오기 전에 관련 스레드를 가르쳐주십시오.문자열에 대한 포인터 배열에 액세스

아래의 코드 조각 (printf 문 검사)에서 동일한 변수를 사용하여 메모리 위치의 값과 메모리 위치의 주소에 액세스합니다. 이것이 내가이 코드를 어떻게 작성해야하는지 확실하지 않습니다. 주소 나 값에 액세스하고 있는지 여부를 명확하게 알려주는 더 좋은 방법이 있습니까?

char *board[NUM_MAX_ROWS] = {"0101001", 
          "1101011"}; 

int main() 
{ 
    int i, num_rows=0, num_cols=0; 

    num_cols = strlen(board[0]); 
    num_rows = ARR_SIZE(board); 

    for (i=0; i<num_rows; i++) 
     printf("%s stored at %p\n", board[i], board[i]); 

} 

내 첫 번째 시도는 분명히 문제가 해결되지 않는이

while(*board != '\0') 
{ 
    printf("%s stored ar %p\n", *board, board); 
    board++; 
} 

처럼 보였다 :)하지만, 난 여전히이는 컴파일러에 의해 해석하는 방법에 대한 아주 확실하지 않다.

감사합니다.

+0

첫 번째 코드가 정확합니다. 포인터 ('char *')를 두 번 전달하고있다. 인자의 해석은 형식 지정자에 의존한다. '% s'은 주소에서 시작하여 NUL 문자에서 멈추는 문자를 출력합니다. '% p'는 단순히 주소를 출력합니다. – jrok

+0

왜 두 번째가 제대로 작동하지 않는지 설명해 주시겠습니까? – texasbruce

+0

두 번째 부분을 오류로 컴파일하지 못했습니다. 증가 값 피연산자로 lvalue가 필요합니다 (++ 보드 참조). 나는 그것이 포인터를 증가시킬 것이라고 생각했다. – dinesh

답변

1

문자열 자체의 주소를 가져 오기 위해 포인터를 한 번 역 참조 해제하여 처음 시도 할 수 있습니다. 당신이 배열 구문을 사용하여 작성할 때

printf("%s stored ar %p\n", *board, *board);

는, BTW는

printf("%s stored ar %p\n", *(board+i), *(board+i));

편집 실제로 동일하다 : 내가 미스 .. 고정 질문을 읽을 것 같다.

0

당신은 이런 식으로 할 수있는 :

#include <stdio.h> 

char *board[] = {"0101001", 
       "1101011", 
       0}; /* note this final 0 as a terminator for stopping the loop */ 

int main() 
{ 
    int i, num_rows=0, num_cols=0; 
    char **c; 

    c = &board[0]; 
    while(*c) 
    { 
     printf("%s stored ar %p\n", *c, *c); 
     c++; 
    } 

    return 0; 
} 

그러나, 당신이 그렇게 할 경우 루프 스토퍼를해야합니다. 또한 명확성을 위해 0 대신 NULL을 사용하는 사람들이 있습니다.

관련 문제