2017년 3월 7일 화요일

포인터 배열 vs 배열 포인터

#include <stdio.h>

int main(void) {
        int arr1[2][2] = { {1,2}, {3,4} };
        int arr2[3][2] = { { 1,2 },{ 3,4 }, {5,6 } };
        int arr3[4][2] = { { 1,2 },{ 3,4 }, {5,6 }, {7,8} };

        int (*ptr) [2];
        int i;
        ptr = arr1;
        printf("**show 2,2 arr1 ** \n");
        for (i = 0; i < 2; i++) {
               printf("%d %d \n", ptr[i][0], ptr[i][1]);
        }
        ptr = arr2;
        printf("**show 3,2 arr1 ** \n");
        for (i = 0; i < 3; i++) {
               printf("%d %d \n", ptr[i][0], ptr[i][1]);
        }
        ptr = arr3;
        printf("**show 4,2 arr1 ** \n");
        for (i = 0; i < 4; i++) {
               printf("%d %d \n", ptr[i][0], ptr[i][1]);
        }
        return 0;
}

질문 : int (*ptr) [2]; 여기서 괄호를 뺴면 오류가 나는 이유가 뭐죠??

질문 : 포인터 배열 vs 배열 포인터먼차이지?
#include <stdio.h>

int main(void) {
        int num1 = 10, num2 = 20, num3 = 30, num4 = 40;
        int arr2d[2][4] = { 1,2,3,4,5,6,7,8 };
        int i, j;

        int *whoA[4] = { &num1, &num2, &num3,&num4 }; // 포인터 배열
        int(*whoB)[4] = arr2d; //배열 포인터
        printf("%d %d %d \n", *whoA[0], *whoA[1], *whoA[2], *whoA[3]);
        // *을 떄고 실행하면 주소값이 프린트됨 >> whoA[]배열에는 (주소)가 있는거니까 *을 사용하여 포인터를 사용하여 한단계 뒤에있는 num을 가리켜주어야함
        for (i = 0; i < 2; i++) {
               for (j = 0; j < 4; j++) {
                       printf("%d ", whoB[i][j]);
                       //여기서 *을쓸떄 오류가 남 whoB ???
               }
               printf("\n");
        }
        return 0;
}

WhoA : 포인터 배열  >> int형 포인터 변수로 이뤄진 int형 포인터 배열
whoB : 배열 포인터 >> 가로길이가 4 int2차언 배열을 가리키는 포인터 변수

답변 추가
(네이버 카페..쓰기전에 구글링먼저하자 재발)
·         연산자 우선순위 때문입니다. []  *보다 우선순위가 높아서 괄호없이 int *ptr[2] 를 하게되면 int형 포인터 2개가 묶인 배열이 생성되는거죠길이는 2칸이고 각 칸의 자료형은 int형 포인터인 배열이요이것이 포인터배열이구요.
반면 int (*ptr)[2] 를 해주게되면, 2칸짜리 int로 된 배열을 가리키는 포인터 하나가 생성되는겁니다이것이 배열포인터입니다.
·          

·         *ptr[ ]이면
{&n1,&n2}
의 형식으로 포인터변수의 묶음으로 보면되고
(*ptr)[ ]
이면 앞서 선언되었을 2차원배열을 가리키는 포인터입니다. ([ ]속은 가로의 길이)



*ptr[2] => *ptr이 두개 => 가로 길이가 가변적인 배열 두개를 달수있다!
(*ptr)[2] => *ptr이 가질 수 있는 배열이 두칸! => 가로길이가 2칸인 고정된 배열을 가질 수 있다!
본문에서 arr1, arr2, arr3은 가로길이가 2칸짜리죵! 이런것들을 가질 수 있다는겁니답.(물론 다른것도 달 수는 있다.)

결론
*ptr[2] => 가로칸수가 가변적이고, 세로줄수는 2칸으로 고정됨.
(*ptr)[2] => 가로칸수가 2칸으로 고정되고, 세로줄수가 가변적임.


2017.03.11 추가내용

#include <stdio.h>
#include <string.h>
void RemoveLine(char str_pointer[]) {
int len = strlen(str_pointer);
str_pointer[len - 1] = 0;
}

int main(void) {
char str[100];
fgets(str, sizeof(str), stdin);
printf("%d : %s \n", strlen(str), str);
RemoveLine(str);
printf("%d : %s \n", strlen(str), str);
return 0;
}
형광팬 친부분에서, &str str 둘다 됬던이유 : 배열명만 써주면 가장 첫밴째 주소를 주는것이므로 &str = str 임
또한 *str_pointer == str_pointer[]도 됨
드디어 안햇갈린다!! 오예아








댓글 없음:

댓글 쓰기