1차배열에서 포인터의 연산과 배열의 이름간 상관관계는 이해했으나
2채배열에서의 포인터의 연산에 대해서는 이해가 잘 가지 않네요
당장 밑의 문제를 봐도 와닿지않는게...
2채배열에서의 포인터의 연산에 대해서는 이해가 잘 가지 않네요
당장 밑의 문제를 봐도 와닿지않는게...
이게 문제고
이게 답입니다.
이게 답입니다.
*은 간접참조연산자라서 arr 2의 주소값에 접근하면 arr[2]가 되는건 알겠으나 *(arr[2] 1)은 이해가 안되네요
처음부터 컴퓨터는 arr이 2차배열ㅡtypeㅡ이라는 정보를 가지고 있어서 이중포인터접근이 가능한건가요?
그러니까..음
arr은 그 자체로 행의 주소값만 나타내는 포인터고
*arr은 해당 행의 열의 주소값을 나타내는 포인터인건가요?
그리구 간접참조연산자가 두번쓰인것도 헷갈리는데
설명부탁드릴게용..
*이 두번쓰여서 하나의 2차배열을 만들었다는건..
arr이 포인터의 포인터라는건가요
제가 생각한게 맞았음 좋겠는데..
그보다 제 글을 이해해주시려나 모르겠네요
이해해주셨다면 설명 붙ㆍㄱ드릴게요
처음부터 컴퓨터는 arr이 2차배열ㅡtypeㅡ이라는 정보를 가지고 있어서 이중포인터접근이 가능한건가요?
그러니까..음
arr은 그 자체로 행의 주소값만 나타내는 포인터고
*arr은 해당 행의 열의 주소값을 나타내는 포인터인건가요?
그리구 간접참조연산자가 두번쓰인것도 헷갈리는데
설명부탁드릴게용..
*이 두번쓰여서 하나의 2차배열을 만들었다는건..
arr이 포인터의 포인터라는건가요
제가 생각한게 맞았음 좋겠는데..
그보다 제 글을 이해해주시려나 모르겠네요
이해해주셨다면 설명 붙ㆍㄱ드릴게요
- dc official App
기분상했음 다른분한테 패스요 - dc App
아니 왜 기분이상하심 - dc App
프갤은 원래 정신병자갤이라 답변다는 사람 빼고는 무시하면 됩니다 ㅎㅎ;
ㄴ 답변달아주세ㅣ용ㅎㅎ.. - dc App
잠만요 읽어보고 달아드릴게요
먼저 맨위의 a[2][3]는 말이죠, 선언할 때 2차원 배열이엇던 변수에 대해서는 안돼요. 저게 되려면 a가 int**이고, a[i]들이 각각 int*이어야 합니다.
선언할때 2차원인 배열 a[10][10]에 대해서 *(a+2)[3]을 하는건 a[5][0]이 될것같아요
아.. 제가 문제를 안찍어올렸네요 문제 찍어서 올릴게요 - dc App
앗 혹시나 해서 돌려보니까 제가 실수를 했네요. ㅇ처음것도 다 잘됩니다. 다만 연산자 우선순위가 잘못된거엿어요.
(*(a+2))[3]으로 하면 제대로 들어갈거에요.
미리선언된 2차원 배열에 대해 이게 동작하는 이유는, 실제로 배열은 어떻게 선언하든 컴파일러가 1차원으로 놓지만 각 인덱스별로 얼만큼씩을 단위로 할지 프로그램에 저장해두기 때문이에요.
아 네! 답이 왜저렇게나오는지는 알았으나 원리가 이해가 안되네요 ㅠㅠ **를 두번써줳다는건 arr이 포인터의 포인터라는건가요? - dc App
반면 동적할당으로 int** a에다가 여러개의 int*을 할당해주면 각각의 행은 서로서로 연속되지 않은ㅡ행 내부에서만 연속되고 행간에는 연속성이 없는ㅡ메모리 위치를 가질텐데, 이 경우에 잘돌아가는것은 더 직관적이죠
ㅇㅇ 포인터의 포인터임 그래서 +1하면 int나 char 이런크깈ㆍ 아닌 포인터크기 만큼 점프뛰는거고
그럼 1차배열과 2차배열에서의 arr은 포인터와 포인터의 포인터로 그 의미가 각각 다른거네요 - dc App
223.39님의 두번째댓을 이해못하겠어요 - dc App
별별이 붙는건 타입을 확인해보시면 되는데, 실제 2차원 배열의 타입이 int(*)[m] 거든요, 이게 뜻하는건 int m개짜리 배열의 포인터(강조합니다 배열의 포인터) 라는 거라, **과는 엄밀하게는 다른 타입이지만 비슷하게 쓸수 있는거에요.
질문을 다시 적어주시면 좋겠어요
제가ㅜ좀 횡설수설 말이길어졌는데
아 배열의 포인터하니까 좀 와닿는것같네요 - dc App
이건 조금 꼼수인데 타입 알아볼때 printf("%c",a);하고 컴파일 에러를 보면 타입이 출력돼요. 안되면 옵션에 warning 최고레벨을 켜보세요(-Wall).
이해할락말락한데.. 질문몇개더 드릴게요. - dc App
1차배열 arr의 배열의 이름은 배열의 포인터가 맞는거죠? - dc App
1차원 배열은 사실 포인터와 동치입니다. 그 자체가 포인터라고 보셔도 돼요.
하지만 2차원부터는 포인터의 포인터와 비슷하지만 약간 달라요. 왜냐면, int a[3][4]를 선언하면 컴파일러는 이걸 12칸짜리 int 어레이로 만들어요. 왜냐면 그게 수십 수백 배 효율적이거든요. 그런데 타입이 그냥 int**이면 컴파일러가 한 줄에 몇 칸씩 있는 어레이인지 모르겠죠?
자 여기서 a[1]이 각각 몇 칸인지 알기 위해서 타입을 새로 만듭니다. int[4]의 **일차원** 배열이죠. 일차원 배열은 포인터와 동치라고 했죠? 그래서 결과적으로 a는 int[4]의 포인터가 돼요.
조금 이해가 됏나요?
네 거기까지는 확실하게 이해했습니다. 문제는 2차원배열인데.. 아 배열의포인터와 포인터의 배열은 엄연히 다른거죠? 그렇다면 2차원배열은 1차원배열 여러개로 이루어져있으니까 2차원배열의 타입이 배열의 포인터인거구요 - dc App
아 이해했다는건41분에쓴 댓글에 대해 이해했다구쓴거예용 - dc App
네 정정해드리자면 "배열의 포인터"와 "포인터의 포인터"가 다른겁니다. 조금 말장난같지만 이해해주세요. 각각 길이를 아느냐와 모르느냐의 차이거든요.
실제로 그래서 3차원 배열의 경우 2차원 배열의 포인터가 돼요.
댓글 계속 읽어봐야겠네요. 원하는부분까지는 설명된것같은데 제가 이해를 못하네요 계속보면 이해할수있을것같아요. 보다 정 모르겠으면 새 글 파서 다시 질문할게요 - dc App
네 열공하세요 이해할수 있습니다
이해했습니다 - dc App
이해한것같네용 - dc App