0:50 int형이니까 4byte씩 늘어나는 건 이해가 되는데 그러면 100번지에서 시작하면 100,104,108,112, 그리고 다음은 116이 되어야 하는거 아닌가 생각했는데 115가 ㅇ나오는게 이해가 되지 않습니다...ㅠㅠㅠ 선생님 설명한번만 해주실수 있으신지요...
메모리는 바이트 단위로 주소값이 있습니다. 따라서 4바이트의 시작 바이트 번지가 100번지라면 각 바이트의 번지는 100, 101, 102, 103번지가 됩니다. 마찬가지로 첫번째 행의 마지막 4바이트의 시작 주소가 112번지라면 각 바이트의 주소는 112, 113, 114, 115번지가 되므로 마지막 바이트의 주소를 115번지로 표시했습니다. 아마도 시작 번지를 표시하다 끝나는 번지를 표시하니 살짝 오해하신 듯 하네요:) 물론 다음 행의 첫 번째 시작 번지는 116번지로 시작합니다.
참 쉽지 않은 질문인데요. 변수부터 개념을 잡아야 할 것 같습니다. 예를 들어, int a = 10; 이렇게 변수가 선언되어 있을 때 &a는 a의 주소고 그 주소에 * 연산을 수행하면 다시 변수가 됩니다. 즉 *(&a) 는 변수 a의 값 10이 아니고 변수 a가 되는 것이지요. 변수는 공간과 값의 2가지 기능을 할 수 있으므로 변수 a와 그 안의 값 10은 다른 겁니다. 배열명도 첫 요소의 주소 기능과 배열 전체를 뚯하는 변수로의 기능 2가지가 있는데요. a+1이 두 번째 부분배열 a[1]의 주소이므로 그 주소에 * 연산을 수행한 *(a+1)은 결국 부분배열 a[1]이 된다는 뜻입니다. 이 후에 이 부분배열명 a[1]이 a[1] 부분배열의 첫 요소의 주소가 될 수도 있고 a[1]배열 전체를 나타내는 변수로의 기능을 할 수도 있습니다. 그 것은 그 이후의 연산에 따라 달라집니다.
@@clecture 빠른 답변 감사합니다 int a=10 에서 a가 1. 변수 그자체 공간의 이름 2. a 안의 값 10 두 가지를 의미 하듯이 *(a+1)은 1. 배열 그자체 공간 이름 2. 배열의 시작주소 두 가지를 의미 *는 단순히 내용을 가리키는 연산자가 아니고 해당 주소값을 시작주소로 갖는 변수를 나타낸다고 생각하면 될까요?
네 맞습니다 :) 어떤 대상의 주소에 간접참조연산(*)을 수행하면 그 대상이 되는 것이죠. 변수의 주소에 *을 붙이면 변수가 되고, 배열의 주소에 *을 붙이면 배열이 되고, 함수의 주소에 *을 붙이면 함수가 되는 것이지요. 포인터는 사실 정말 쉬운데요. * 연산을 통해 구한 대상에 대한 이해가 부족해서 포인터를 제대로 사용하지 못하는 경우가 많습니다. 변수도 공간과 값 2가지 기능이 있는데 변수의 주소에 *를 사용하면 그 변수의 값을 구해준다고 생각하기 쉽거든요. 배열 포인터도 2차원 이상의 배열에서 사용하는데 2차원 배열에 대한 이해가 부족하면 포인터가 어려운 것으로 오해할 수 있습니다.
안녕하세요. 선생님께서 쓰신 '혼자 공부하는 C언어' 를 보면서 C언어를 공부하는 학생인데요. 2차원배열의 배열명인 a는 첫번째 배열 요소의 주소값이므로 a+1 이라는 연산을 수행했을 때 그 다음 배열요소인 2번째 행으로 가게되어 116이라는 주소값을 나타낸다는건 잘 이해가 되는데요. 여기에 * 연산자를 취해서 *(a+1) 이 되면 두 번째 행 전체를 쓸 수 있게 된다는게 무슨 의미인가요? 그래서 *(a+1)+2 을 해주면 두 번째 행의 3번째 열을 가리킨다는게 잘 이해가 안되요ㅜㅜ 그냥 제 스스로 이해를 해보자면 *(a+1) 이 두 번째 행 전체를 쓸 수 있다는 말은 *(a+1) 이 두 번째 행의 배열명이 된다는 의미로 해석하고, 그래서 배열명이 첫 번째 배열 요소의 주소값이므로 *(a+1) 은 2번째 행의 첫 번째 열의 주소값을 가진다고 꾸역꾸역 생각해보았는데... 그러면 a+1 이 가리키는 자료형은 int[4] 이고 *(a+1) 를 했을 때 , int[4]를 가리키는 주소값에서 int형 하나을 가리키는 주소값으로 바뀌었다는 말인데... 이런 관계를 잘 모르겠어요 선생님 ㅜㅜㅜ
a+1 이 가리키는 것은 int[4]형의 1차원 배열이죠. 여기에 별(*)을 붙인 *(a+1)은 int[4]형 1차원 배열이되고 결국 *(a+1) 요 표현식은 1차원 배열의 배열명으로 쓰입니다. 여기까지 이해하셨으면 그 다음이 중요한데요. 배열명은 그 배열의 첫 요소의 주소로 쓰일 수 있으므로(주소가 아니라 주소로 쓰일 수 있음) *(a+1)은 int형 하나의 주소값이 될 수 있습니다. 즉 int[4]형을 가리키는 주소 a+1에 별(*)을 붙이면 int형을 가리키는 주소가 되는 것이 아니라 int[4]형의 배열(명)이 되었다가 그 배열명이 int형의 주소로 쓰일 수 있다는 뜻입니다. 배열명은 첫 요소의 주소 상수의 기능과 배열 전체를 뜻하는 자료형의 기능 두 가지를 갖고 있습니다. 따라서 배열명 *(a+1)이 첫 요소의 주소 상수로의 기능을 한다고 단정지어서는 안됩니다. 배열명에 어떤 연산을 수행하느냐에 따라 주소로 쓰일 수도 있고 배열 전체를 뜻하는 변수로의 기능을 할 수도 있거든요. 우리가 코드에서 별(*)만 보고 곱하기를 하는 것인지 포인터 연산을 하는 것인지 알 수 없듯이 *(a+1)이 int형의 주소라고 생각해선 안됩니다. *(a+1)은 결국 int형의 주소가 아니라 int[4]형 배열(명)인 것이죠. 그리고 나서 *(a+1) + 2 와 같이 2를 더하는 연산을 수행하면 컴파일러는 배열명 *(a+1) 이것이 갖는 두 가지 기능 중에 첫 번째 기능인 주소 상수(첫 요소의)로서의 기능을 수행하여 2번째 행의 시작 주소에서 옆으로 주소계산을 하게 됩니다.
@@clecture빠른 답변 해 주셔서 너무 감사드립니다. 지금 유튜브에 올라와 있는 혼공C 강의 들으면서 책이랑 같이 공부 중인데, 너무 큰 도움 되고 있습니다. 선생님이 판서해주신 배열명이 가지는 2가지 의미를 교재에 받아 적어 놓고도 , 개념을 잘 연결시키지 못 했었네요. 이제 너무 잘 이해되었습니다!! 매번 좋은 강의 올려주셔서 감사합니다^^ 수고하세요 :)
포인터강의 감사합니다
여러 동영상을 봐도 포인터에 대한 개념이 잘 잡히지 않았는데, 그림으로 쉽게 설명해주시니 이해가 잡히네요.
감사합니다.
영상이 도움이 되셨다니 기쁘네요. 배열 포인터를 포함한 응용 포인터는 어렵지만 하나씩 이해 되기 시작하면 재밌고 뿌듯하지요:)
이거 보고 배열 포인터가 뽝 이해되었습니다. 감사합니다 :)
배열 포인터 이해했으면 포인터 95%는 이해한거죠 :0
0:50 int형이니까 4byte씩 늘어나는 건 이해가 되는데 그러면 100번지에서 시작하면 100,104,108,112, 그리고 다음은 116이 되어야 하는거 아닌가 생각했는데 115가 ㅇ나오는게 이해가 되지 않습니다...ㅠㅠㅠ 선생님 설명한번만 해주실수 있으신지요...
메모리는 바이트 단위로 주소값이 있습니다. 따라서 4바이트의 시작 바이트 번지가 100번지라면 각 바이트의 번지는 100, 101, 102, 103번지가 됩니다. 마찬가지로 첫번째 행의 마지막 4바이트의 시작 주소가 112번지라면 각 바이트의 주소는 112, 113, 114, 115번지가 되므로 마지막 바이트의 주소를 115번지로 표시했습니다. 아마도 시작 번지를 표시하다 끝나는 번지를 표시하니 살짝 오해하신 듯 하네요:) 물론 다음 행의 첫 번째 시작 번지는 116번지로 시작합니다.
@@clecture 아하 바로 이해했습니다!! 감사합니다 선생님!
좋은 영상 감사합니다
4:00 정도부터 a+1이 116번지인건 알겠는데 *(a+1)이 배열명을 나타낸다는게 잘 이해가 안갑니다 *는 내용물 나타내는 간접지정연산자 아닌가요?
참 쉽지 않은 질문인데요. 변수부터 개념을 잡아야 할 것 같습니다. 예를 들어, int a = 10; 이렇게 변수가 선언되어 있을 때 &a는 a의 주소고 그 주소에 * 연산을 수행하면 다시 변수가 됩니다.
즉 *(&a) 는 변수 a의 값 10이 아니고 변수 a가 되는 것이지요. 변수는 공간과 값의 2가지 기능을 할 수 있으므로 변수 a와 그 안의 값 10은 다른 겁니다. 배열명도 첫 요소의 주소 기능과
배열 전체를 뚯하는 변수로의 기능 2가지가 있는데요. a+1이 두 번째 부분배열 a[1]의 주소이므로 그 주소에 * 연산을 수행한 *(a+1)은 결국 부분배열 a[1]이 된다는 뜻입니다. 이 후에 이 부분배열명 a[1]이 a[1] 부분배열의 첫 요소의 주소가 될 수도 있고 a[1]배열 전체를 나타내는 변수로의 기능을 할 수도 있습니다. 그 것은 그 이후의 연산에 따라 달라집니다.
@@clecture 빠른 답변 감사합니다
int a=10 에서 a가 1. 변수 그자체 공간의 이름 2. a 안의 값 10 두 가지를 의미 하듯이
*(a+1)은 1. 배열 그자체 공간 이름 2. 배열의 시작주소 두 가지를 의미
*는 단순히 내용을 가리키는 연산자가 아니고 해당 주소값을 시작주소로 갖는 변수를 나타낸다고 생각하면 될까요?
네 맞습니다 :) 어떤 대상의 주소에 간접참조연산(*)을 수행하면 그 대상이 되는 것이죠. 변수의 주소에 *을 붙이면 변수가 되고, 배열의 주소에 *을 붙이면 배열이 되고, 함수의 주소에 *을 붙이면 함수가 되는 것이지요. 포인터는 사실 정말 쉬운데요. * 연산을 통해 구한 대상에 대한 이해가 부족해서 포인터를 제대로 사용하지 못하는 경우가 많습니다. 변수도 공간과 값 2가지 기능이 있는데 변수의 주소에 *를 사용하면 그 변수의 값을 구해준다고 생각하기 쉽거든요. 배열 포인터도 2차원 이상의 배열에서 사용하는데 2차원 배열에 대한 이해가 부족하면 포인터가 어려운 것으로 오해할 수 있습니다.
안녕하세요. 선생님께서 쓰신 '혼자 공부하는 C언어' 를 보면서 C언어를 공부하는 학생인데요.
2차원배열의 배열명인 a는 첫번째 배열 요소의 주소값이므로
a+1 이라는 연산을 수행했을 때 그 다음 배열요소인 2번째 행으로 가게되어 116이라는 주소값을 나타낸다는건 잘 이해가 되는데요.
여기에 * 연산자를 취해서 *(a+1) 이 되면 두 번째 행 전체를 쓸 수 있게 된다는게 무슨 의미인가요?
그래서 *(a+1)+2 을 해주면 두 번째 행의 3번째 열을 가리킨다는게 잘 이해가 안되요ㅜㅜ
그냥 제 스스로 이해를 해보자면
*(a+1) 이 두 번째 행 전체를 쓸 수 있다는 말은 *(a+1) 이 두 번째 행의 배열명이 된다는 의미로 해석하고,
그래서 배열명이 첫 번째 배열 요소의 주소값이므로 *(a+1) 은 2번째 행의 첫 번째 열의 주소값을 가진다고 꾸역꾸역 생각해보았는데...
그러면
a+1 이 가리키는 자료형은 int[4] 이고
*(a+1) 를 했을 때 , int[4]를 가리키는 주소값에서 int형 하나을 가리키는 주소값으로 바뀌었다는 말인데...
이런 관계를
잘 모르겠어요 선생님 ㅜㅜㅜ
거의 90프로는 이해하셨네요:) 오늘 중으로 자세한 답변 달아드릴게요~
a+1 이 가리키는 것은 int[4]형의 1차원 배열이죠. 여기에 별(*)을 붙인 *(a+1)은 int[4]형 1차원 배열이되고 결국 *(a+1) 요 표현식은 1차원 배열의 배열명으로 쓰입니다. 여기까지 이해하셨으면 그 다음이 중요한데요. 배열명은 그 배열의 첫 요소의 주소로 쓰일 수 있으므로(주소가 아니라 주소로 쓰일 수 있음) *(a+1)은 int형 하나의 주소값이 될 수 있습니다. 즉 int[4]형을 가리키는 주소 a+1에 별(*)을 붙이면 int형을 가리키는 주소가 되는 것이 아니라 int[4]형의 배열(명)이 되었다가 그 배열명이 int형의 주소로 쓰일 수 있다는 뜻입니다. 배열명은 첫 요소의 주소 상수의 기능과 배열 전체를 뜻하는 자료형의 기능 두 가지를 갖고 있습니다. 따라서 배열명 *(a+1)이 첫 요소의 주소 상수로의 기능을 한다고 단정지어서는 안됩니다. 배열명에 어떤 연산을 수행하느냐에 따라 주소로 쓰일 수도 있고 배열 전체를 뜻하는 변수로의 기능을 할 수도 있거든요. 우리가 코드에서 별(*)만 보고 곱하기를 하는 것인지 포인터 연산을 하는 것인지 알 수 없듯이 *(a+1)이 int형의 주소라고 생각해선 안됩니다. *(a+1)은 결국 int형의 주소가 아니라 int[4]형 배열(명)인 것이죠. 그리고 나서 *(a+1) + 2 와 같이 2를 더하는 연산을 수행하면 컴파일러는 배열명 *(a+1) 이것이 갖는 두 가지 기능 중에 첫 번째 기능인 주소 상수(첫 요소의)로서의 기능을 수행하여 2번째 행의 시작 주소에서 옆으로 주소계산을 하게 됩니다.
@@clecture빠른 답변 해 주셔서 너무 감사드립니다. 지금 유튜브에 올라와 있는 혼공C 강의 들으면서 책이랑 같이 공부 중인데, 너무 큰 도움 되고 있습니다. 선생님이 판서해주신 배열명이 가지는 2가지 의미를 교재에 받아 적어 놓고도 , 개념을 잘 연결시키지 못 했었네요. 이제 너무 잘 이해되었습니다!! 매번 좋은 강의 올려주셔서 감사합니다^^ 수고하세요 :)