아하
생활

생활꿀팁

신랄한아나콘다201
신랄한아나콘다201

포인터와 배열의 차이점질문드립니다

포인터와 배열 둘다 저장된곳에서 불러오는걸로 알고 있는데 배열과 포인터를불러올때 큰 차이라고 할게 있을까요?

*char ,char [] 로 저장햇을때 둘의 출력결과가 같아서요! 코린이라 너무어렵게설명안해주셔도됩니다 ㅎㅎ

55글자 더 채워주세요.
1개의 답변이 있어요!
  • 따뜻한물수리156
    따뜻한물수리156

    char str[] = "abc";

    char *str = "abc";

    printf("%s", str) 하면 똑같이 abc가 찍혀나오니깐 별 차이가 없다고 생각할 수도 있겠지만 이 두 선언은 엄연히 다릅니다.

    char *str와 char str[]은 둘다 문자열을 담기위해 사용합니다. 하지만 용도는 같더라도 담는 방법이 다릅니다.

    당연한 소리지만, char str는 포인터고 char str[]는 배열입니다. 얼핏 보면 둘다 문자열을 담거나 작업할때 쓰여서 같아보일지라도, char str도 char str[]처럼 "선언과 동시에 초기화"를 할 경우 확실하게 차이가 납니다.

    우선 역할을 보면 char *str은 주소를 담고, char str[]은 값을 담습니다.

    아래 예제를 보면 차이점을 이해할 수 있을겁니다.

    int main()
    {
        char *str = "abc";
        str[0] = 'b';
    }

    str은 .rodata 영역에 있는 "abc"에 대한 포인터이므로 이 값을 바꾸려고 하면 오류가 발생합니다.

    여기서 .rodata는 읽기 전용(read only) 데이터를 말하며, 이를 수정할수 없기에 오류가 발생합니다.

    int main()
    {
        char str[] = "abc";
        str[0] = 'b';
    }

    이 프로그램은 문제없이 수행되며 str을 출력해보면 "bbc"가 나옵니다. 이런 차이가 나는 이유는 str[]의 경우 함수 호출 시에 .rodata의 "abc" 문자열을 함수의 스택으로 복사해오기 때문입니다.

    즉,  char *str는 값을 변경시키지 않기 위하여 상수로 많이 사용되며 char str[] 값을 변경시키기 위한 변수로 많이 사용합니다.