#include
int main() {
int arr[10] = {100, 98, 97, 95, 89, 76, 92, 96, 100, 99};
int* parr = arr;
int sum = 0;
while (parr - arr <= 9) {
sum += (*parr);
parr++;
}
printf("내 시험 점수 평균 : %d \n", sum / 10);
return 0;
}
여기서
int* parr = arr;왜이거 해야하는지 그냥 arr++ 이렇게하면 오류뜨던데 왜 안되는지 이유좀 알려주세요 ㅠ
arr한테는 책임져야할 아내와 자식들이 있거든
메모리 구조땜에 저렇게 안된다는 말인가요
arr에 그냥 더해버리면 배열이 이상해지잖아
sum += *(arr+i) 이렇게 해야됨 너말처럼 할라면
arr은 상수인걸로 알고있어요
while문 조건 땜에 다른거 바꾸면 안됨
나도 이거 헷갈리는데... the C programming language 책에 따르면, arr 즉 &arr[0] 의 첫번째 주소는 스택에 쌓고, 그 주고가 가리키는 공간은 data segment 에 저장된다고 설명하고 있어.
근데 너가 arr 주소값을 올려버리면, 스택은 높은 번지에서 낮은번지로 쌓이는데, 나보다 높은 번지의 스택을 침범하게 돼자나, 그래서, 컴파일러가 침범하지 못하게 막고있어서 안됌
예전에는 이런방법으로 스택의 높은 번지를 공략하면, 결국 스택밖의 argc argv 공간으로 넘어가서 , 오버플로우 해킹이 가능했었는데.... 아무튼
엄밀히 말하면 arr 과 parr은 다른 공간에 있다는 말이죠?
parr 은 포인터인데 스택에 싸여 즉 arr 보다 보다 낮은 번지 스택에 쌓인다. 그런데 포인터는 자기 주소가 변하는게 아니고, 자기가 담고 잇는 주소값이 변하는거야, 그러니깐 parr++; 하면 데이타 세그먼트의 그주소 다음 주소를 가리키지..
아... 그렇구나 설명 감사합니다. 당연히 parr의 실 주소는 arr이랑 다르겠죠. 많이 헷갈리네요
arr의 주소는 스택에 쌓는다는점이 인상깊네요. 이건 독학할때 못봤던 내용인거같은데
지역 변수 배열인데 데이터 세그먼트에 들어감? 배열 통채로 스택에 쌓이는거 아닌가?
잘못 알고있는것같은데... 만약 arr가 ds를 가르키고 있고 그 값이 스택에 존재한다면 parr = arr 한다음 parr++ 하면 parr은 스택의 다음 영역을 가르키게 되는데 만약 arr이 스택에 없으면 parr은 이상한 값을 가르키게 됨 배열이 통채로 스택에 올라가는게 맞을텐데 전역변수 아니면
헷갈리네, arr ds 에 있고, 이 있고 내용이 arr 맴버가 스택에 쌓이는건가.......
내가 메모리를 봐봤는데... 내 맥의 경우는, 최적화를 해서 그런지, 스택에 일반변수부터 높은번지에서 낮은번지로 쌓이고, 그담에 배열,포인터가 쌓인다.. &arr[0] 는 스택에 이 맞고, 포인터인 &p 도 스택이 맞다.
그런데, the C programming language 에보면 arr 이 배열인, arr 이 &arr[0] 과 같다는 것은 포인터 *p 가 &p 와 p 가 다른데... 좀 이상하다고 생각 안하냐?
그러니깐 배열인 arr 의 자기 자신의 주소는, &arr[0] 과 같으면, 이것을 포인터로 생각하면, &p 와 p 가 같다는 뜻인데... 포인터에서는 &p 는 스택의 위치이고 p 는 &arr[0] 의 주소자나, 그러니까 내부적으로 arr 의 진짜 주소는 데이타 세그먼트가 맞는거 같다. 이게 스택의 &arr[0] 을 가리키겠지...
c만배우긴했는데 arr은 상수라서 못바꾼다고 교수님이 얘기해주셨음 상수포인터 - dc App
어셈블리어 수준에서는 니 말이 가능한데, 컴파일러 수준에서 arr을 readable로 취급해서 그 값을 바꾸려 들면 에러뜬다.
내 생각은 이렇다.... 기계어 수준에서 , 변수는 주소를 근거로 그 값을 계산할거 아니겠어, 배열도 배열의 주소로 멤머값을 찾아갈거 아니겠어, 하지만 포인터 변수는 포인터 변수의 주소값을 가지고 담겨잇는 주소를 한번더 찾아가는거 아니겠어, 그런데 배열을 포인터 처럼 사용하기도 하니까, 배열의 포인터처럼 사용하기 위해서, 즉 포인터연산자를 쓰기 위해서.. 첫번째 주소를 다른 무엇으로부터 포인터 연산자를 섰다는 말이 되는거지,
개소리를 있어보이게 써놨네 그냥 상수라서 안되는건데 ㅋㅋ