내가 엣날에 한창 자료구조공부햇을떄 문법적으로 힘들고 막힌점이많앗고 , 그러한점들을 스스로 연구하면서 내가 내린결론이있는데 지금은 비록 C말고 자바스크립트하지만 군대가기전에 그냥 물어보고싶다ㅎ
코드부터보자 ㅎ
질문들어가기전에 정의하고넘어갈것.
A,B,C변수는 스택에서 정적으로 메모리에서 4바이트공간을 할당받은뒤 , 각각의 시작주소값을 A와B와C에게주었다. 여기서 A는 1000~1003 공간을, B는 1010~1013공간을 , C는 1020~1023 공간을할당받앗다치자. 그럼 A는 1000주소값을 , B는 1010주소값을 , C는 1020주소값을 갖고있다.
질문들어감.
1. 11행과 12행에서 힙메모리에서부터 8바이트를 공간할당받았다. 하나는 2000~2007 , 두번째는 2010 ~ 2017 그리고 각각의 시작주소값을 캐스팅한뒤 A와 B변수에 주었다. 즉 A는 2000번지의주소값을갖고있으며 , B는 2010번지의주소값을갖고있다. 이렇게 시작주소값을갖고있으면 할당받은메모리영역전체를 controll할수있다. 즉 , 할당받은메모리영역에대해서 CRUD를 할수있다고볼수있지.
2. 10행에서 선언햇을떄의 정적으로할당받은 A와 C의 메모리영역은 결국 버려지게되고 새로운 메모리영역을 가리키게되므로 8바이트는 낭비되는것이다. 그나마 포인터변수가4바이트이기때문에 이러한 메커니즘이 프로그램의 퍼포먼스에 영향을끼치지는 않을거라고 판단된다.
2. 근데 여기서 캐스팅왜할까? 그이유는 바로 주소값체계(운영체제나이런걸공부해본적이없기때문에 그냥 내마음대로이름붙였따) 때문이다.
힙에서 8바이트공간을할당해줫고 이 메모리를 a라는자료형으로 맞추기위해서 캐스팅햇다. 즉 ,이말은 앞으로 이 메모리를 controll할려면 이 메모리의시작주소값을 받을수있는 변수는 a라는자료형이어야 된다. 이렇게 자료형을맞춰주는이유는 주소값쳬게가 무너지는것을 막기위함이다
3. 13행에서 실제로 값을쓸때는 16비트 2진수로쓴다. A->data에 5를쓰고잇는데 A->data는 2000~2003 영역일것이다. 하지만실제로 2000번지에만 쓰여질것이다. 왜냐하면 2000번지하나로도 5라는값은 표현할수있기때문이다.
4. 16행에서 B가 A의주소값을대입받는다. 즉 이것을 B가 A를 가리킨다라고도 표현할수있지. 그런데 여기서 재대로짚고넘어가야할게있다.
B는 과연 동적할당을 받지않아도되는것일까?
그렇다. 사실동적할당이란게 힙메모리에서 메모리영역을할당받고 단순히 그의시작주소값만 변수에할당해서 변수가 그 메모리영역을 controll하는거기때문에 , B라는 포인터변수가 시작주소값만가지고있으면 B변수도 그 영역을 controll할수있다. 이게 포인터의 핵심중에 하나라고 생각한다.
마지막으로 , 14행의 A->next가 C를가리키는 메커니즘도 방금말한것과 동일하다. 그런데 next는 자기참조구조체로써 , a라는자료형(구조체)의 포인터변수다. 그래서 C의주소값을 대입받을수가있다. C는 a라는자료형의포인터변수이므로 좌변과 우변의 자료형이 일치하며 , 2번질문에서 말한 주소값쳬계때문이라고도볼수있다.
5. 17행에서 B도 2000번지를 가르키게되엇으므로 4번질문에서 말햇다시피 2000번지에서 2007번지까지의 메모리영역을 controll할수있다. 그래서 B->data 즉 , 2000~2003 영역에 5라는값을썻다.
나는 ㅅㅅㅅ하고 코세가 좋은답변을 달아줄것이라고 믿는다ㅋ. 그런데 한가지만 부탁하자. 답변을달아주기전에 먼저 1,2,3,4,5번질문에 맞다,아니다 부터 말해주고 아니다라면, 그에대한설명을해주면좋겠다.
코드명 : 'sexer'
int* b = &a;
int** c = &b;
int*** d = &c;
***d = 3;
이건 3중포인터의 예지.
&c; 를 두고 3중 포인터라고 말하진 않아. 왜? 가져다 쓰고 있지 않으니까.
즉 2중, 3중... 포인터란 표현은 용도를 명확히 하기위해 사용하는 표현일 뿐이지. 그냥. 주소는 주소인거고 변수는 변수인거지.
int **c = &b;까진 이해된다. b도 할당받은메모리영역이있으므로 이 주소값이 c에대입되겟지. 근데시팔 결국엔 다 똑같은 메모리주소값인데 *를 하나씩더붙여가네;
저렇게 안해도 돼
이걸 또 봐.
int a = 5;
int* b = (int*)&a;
int* c = (int**)&b;
int* d = (int***)&c;
아코
저 씨발새끼 조또 못하는 새끼가 껴들고 있어 ㅉ.
"참조" 란 말의 메카니즘을 설명하지도 않을거면서 니딴식으로 설명하면 변수의 메모리 사용메카니즘을 이해못하는 애가 잘도 이해하겠다.
돌대가리야. ㅉㅉ
시팔 그냥 다독같은 메모리에 서로서로 조금씩할당받은거고 이 값을 대입시킬때 이게 몇번씩랩핑되어잇냐에따라서 캐스팅을한번더해주냐안해주냐의차이아니냐?
그건 설명이 아니라 니가 내린 정의일 뿐이야.
위의 캐스팅은 C 에선 필요없다. 타잎을 깐깐하게 따지지 않으니까
int *a;a = (int*)malloc(sizeof(int)*(30)); 이렇게햇을시 a[1], a[2] 이렇게 메모리에값을쓸수잇다. 그럼 &a는 원래 처음에할당받은 메모리영역의시작주소값일거고 , a는 동적할당받은 주소값을 가르키겟네?
C++ 기준으로 캐스팅을 한거야 (마지막 캐스팅 빼고)
닥치고
내가 보여준 마지막 식을 봐.
int a = 5; int* b = &a; int* c = (int**)&b; 이런식으로 했잖아?
***(int*)d = 3; 어 시팔 이게어떠케가능하냐?
다르게도 표현할 수 있어
***(int***)d = 3;
int a = 5; int b = (int)&a; int c = (int)&b; int d = (int)&c; ***(int***)d = 3; 도 된다.
int* c = (int**)&b; 이건또머고? 우변의값은 이중포인터인데 좌변의값은 그냥주소값인데? 아 또 머리아프네씨발 짜쯩난다
저새끼 끼어들어 방해해서 헷갈린거임.
쏘리.
(int*)&b;
int* c = (int**)&b; 그럼 이건니가실수한거?
모조리 일반 변수로 선언하고도 저렇게 삼중 포인터로 캐스팅해서 처리할 수 있어.
ㅇㅇ
당연히 대입문 기준 lvalue 와 rvalue 는 갖게 맞춰야지.
타잎이 같도록 맞춰야지.
이중 포인터도 삼중포인터도 존재하지만, 그걸 니가 일일이 매번 세고 파악하고 있을 필욘 없어
야이 개새끼야 코딩 배틀 뜰래 아가리 쳐 다물래?
잘난척할거면 제대로 잘난척해봐.
그럼 결국 캐스팅할떄는 몇번랩핑됫냐이네?? 하지만 그 본질은 결국 다똑같은주소값이고...
글쓴이가 니한테 쳐 묻디?
본질은 다 그냥 값 이지
주소 값이 아니라.
내가 말했잖아. 니가 변수에 대한 개념이 없다고.
포인터형 변수는 그냥 4바이트형 변수일 뿐이야. int 처럼.
아 맞다 그래.. 값이지.. &a라면 1000~10003의 1000번지일거고
다만 특별히 포인터 관련 연산자를 지원할 뿐이라고.
좆도 허접새끼가 아는거 조금 나왔다고 잘난척 하는거 봐라. 내가 퀴즈 몇 개 내줄까?
디질래?
정말 잘난걸 증명하든지 새끼야. 어디서 깔짝 깔짝 간보고 있어.
변수라는것을 내가 방금 새롭게정의햇음. 변수란? 메모리영역에다 값을쓸수잇게끔해주는 대변인이다. 포인터변수라면 주소값을써야되고 그냥변수라면 값을쓴다.
조금만 진지하게 이야기해도 탈탈 털릴 새끼가 ㅉ
틀렸어.
시발머가또ㅠ틀림?
포인터 변수란건 그냥 변수고, 다른 변수처럼 값을 읽고 쓸 수 있는데, int 처럼 컴파일러에서 제공하는 system word 크기일 뿐이고, 포인터 관련 연산자를 지원하는 타잎일 뿐이다.
넌 주소값이라고 했잖아.
아씨발 ;;; int *a = 5; 이게ㄷ가능한가보네 니가말한거보니까
int *a = 5; printf("%d", a); 하면 5가 주소였냐? 값이지. 그건 목적에 따라 의미를 부여한것일 뿐이야.
int a = 5; int *a = 5둘다되지만 int a; int b = &a; 이건안됨 이건 포인터변수로해결할수잇음 int a; int *b= &a;
변수와 포인터 변수 개념도 없는애한테 참조를 논하는 멍청잼 새끼 대가릴 확 그냥.
int b = (int)&a; 이건 되잖아.
포인터 변수고 변수고 걍 다 변수야. 오케이?
그건 a의주소값은 int형으로캐스팅해서준거잔아 그럼 주소값을 정수형으로바꿔서넣은거네
당연히 char b = (int)&a; 이건 짤리지.
그러니까, 걍 다 변수고 걍다 변수처럼 읽고 쓰고 된다고. 포인터 연산이 필요할때만 의미있는거라고.
int a = (int)"Hello world"; printf("%s", a); 이것도 되겠지?
ㅇㅇ 오버플로나겟지. 그럼겱국 캐스팅하는이유는 내가위에서2번질문으로한 주소값쳬게라는게 잇는거임??
아니시팔 그건안되지
정의된 말로 개념이 안들어오는 애한텐 하나 하나 예를 들어주는 수 밖에 없다.
왜 안되나?
왜 오버플로 나냐
멍청아
"Hello world" 는 이미 리터럴 영역에 할당되어 내용이 저장되었고
그 시작주소를 int 로 캐스팅해서 int a 에 담은건데
아...아니다..내가 printf함수의 포맷인자에대해서 잘아는것도아니고... 괜히 얘기햇다가 또까일것같네
왜 안되냐 똘추야.
아니 오버플로는 char b = (int)&a; 이 거말한거임시발
리터럴 문자열 (C 언어에서 따옴표로 명시한 문자열) 은 데이타영역의 앞부분에 자동 할당되어 적혀진거야.
응. 그건 짤리지. 내가 짤린다고 했잖아.
그건 오버플로라고 말하지 않는다.
truncated 끝이 짤렸다고 하는거다.
결국 포인터변수든그냥변수든 캐스팅을통해서 어떠한값이라도써넣을수잇고 , 포인터라는개념이있는이유는 할당받은메모리영역에 접근(읽기나쓰기)을 하기위해서잕아
우린 리틀 엔디언을 쓰니까 큰자릿수가 짤린거지만 암튼.
형 집가서좀더얘기하면안될까
형 저녘에나한테 시간투자가능?
포인터라는 개념이 있는 이유는 포인터 연산을 하기 위해서다.
나머지는 폰으로쓸게
주소값이 있는 이유가 특정 메모리에 접근하기 위한거고.
ㅇㅇ 포인터연산이 결국 주소값을 주고받고잔아
시간없어. 군대나 가버렷!
가서 다 잊어버리고 몇 년 뒤에 조금씩 떠오르겠지.
하 그래 시발 나도힘들다 머씨발 내가이떄까지 C프로그래밍하면서 니가말한거 아무것도몰랏는데도 전혀문제될거없엇음. 앞으로도문제될거없을거임 그렇게믿을거임. 시간투자해줘서 고마웟음 수고해라 ㅋ
하 시발 나존나구차하다.. .시발...그렇게믿긴개뿔... 하시발 꼬추땔까...하
개꿀잼 ㅋㅋ
프갤에 채팅앱 놔드려야게써요
아이고 이게뭐람
으아 질문도 어마어마하고 댓글도 많아서 읽어내기가 힘들다