가 집에오는 버스에서 곰곰히생각해봣다
typedef struct _a {
int data1;
int data2;
}a;
a *A,*B;
A = (a*)malloc(sizeof(a));
A-> A- gt;>
B = A;
printf("%d\n",B->data1);
A는 1000~1003 영역에할당됫고 B는 2000~2003 영역에할당됫다고가정.
B의 메모리공간에 A가 동적할당받은 시작주소값을집어넣음 이떄 주소값은4바이트임. ( 3000~3007 라고가정)
마지막 출력문에서 B->data1 을 상세히설명해봄
B는 3000번지를가리킴. -> data 는 3000~3004번지를가리킴.
마지막으로정리해보자면 , 위에서 선언된 B라는 포인터변수는 동적할당받은 공간의 시작주소값을 값으로 받앗고, 이 값으로 data1영역을 참조햇음.
코세형님은 맞다,아니다라고만말해주셈 부연설명해줄필요없음. 진짜 딱 맞다아니다라고만말해주샘 진짜 한번만더말함 맞다,아니다라고만말해주샘
그니까 yes or no라고만말해주샘 제발
포인터 변수는 포인터 연산을 위한 변수 라고 정의했듯이 말야.
하나로 묶을 수 있는데 void 는 예외다, 크기를 가리킨다. 할 필요가 없지.
곧 저녀석이
저도 결국 포인터의 값은 메모리 주소라는 개념에 입각해 성님처럼 생각한 때도 있었지만. 좀 더 매끄럽게 설명하기 위해선 포인터라는 개념은 범위를 가리키는 거라고 이해하는 게 더 간단하게 설명이 되더라고요.
+1 하는데 sizeof된 값만큼 주소가 더해지는지 이해시키는 대목에서요.
a++ 의 의미가 a = a + sizeof(*a) * 1; 이란걸 배우게 될테고
a += b; 의 의미가 a = a + sizseof(*a) * b; 란걸 배우게 될텐데
포인터가 왜 이런식으로 연산되는가를 생각해 보면, 배열처럼 접근의 크기 단위로 연산되기 위한것이란걸 알게 되겠지.
근데 결국 성님이랑 저랑 설명하는 건 같아요. 성님은 그걸 나눠서 설명할 뿐이지 저는 한 개념으로 뭉쳐서 설명할 뿐이고요.
그것까지 한방에 설명하는게 저 방식이란거야.
의미는 같지. 난 내가 하나로 뭉쳐서 설명하고 있다는거고.
"포인터 연산" 이란 키워드 하나로 말야.
전 *ptr로 dereferencing할 때 type size만큼 접근하는 거랑 더하고 뺄 때 type size만큼 더하고 빼지는 현상을 그냥 묶어서 포인터는 type size 범위만큼 가리킨다 라고 설명할 뿐이에요.
크기를 가리킨다는게 얼마나 웃긴데 ㅡ, .ㅡ
포인터 값의 데이터 자체는 메모리 주소만 가리키겠지만.
그러면 포인터 자체의 가리킨다는 의미와도 또 달라져.
니가 가리킨다의 중의성을 인정하고 있다는거야. 난 그걸 적절치 않다는거고.
그런 개념으로 받아들이고 써도 문제는 없으니까요. 원래 C 설계자들이 의도했던 건 제 느낌에 더 가까운 거 같은데요?
결국 성님이 생각하고 계시던 가리킨다는 개념은 pointer가 point하는 행위에서부터 추출된 개념이기 때문에
그 point하는 행위의 정의가 바뀐다면 문제 없어요.
흠 난 그렇게 생각하지 않아. 첫째 너의 크기를 가리킨다 라는 표현은 가리킨다의 의미를 복수개로 만들어버려.
둘째 포인터 변수를 자꾸 특수하게 만들고 있어. 그냥 변수인데. void 도 예외취급.
결국 성님이랑 저랑 pointer의 point하는 행위의 정의를 달리 볼 뿐이에요. 서로의 체계 하에서는 모순 없이 맞아요. 물론 "가리키다"의 의미 자체도 달라지고요.
void는 無 잖아요? 0바이트를 가리키는 거죠. 그러니 더하고 뺄 수도 없는 거죠.
한때 printf 함수도 값을 반환하니까 (void) printf(...); 처럼 쓰자는 주장도 있었죠. void가 無기 때문에 그래요.
셋째 포인터의 이해의 끝은 결국 포인터 연산이야. 주소는 굳이 포인터라는 구구절절한 타잎의 도움을 받을 필요가 없어.
javascript에서도 void(...); 식으로 값을 없애버리기도 하고요.
수직선을 그어서 생각했을 때 char *는 1바이트 만큼의 범위를, short *는 2바이트 만큼의 범위를 가리키지만 void *는 0바이트 만큼의 범위, 다시 말해 눈금선 자체를 가리킬 뿐.
자바스크립트에서 void가어딧냐미친련아
void 는 C/C++ 없다와, 정해지지 않았다. 두가지 의미로 써.
자바사크립트에선 언디파인드 대입하면 걍없애는건데 뭔 void ㅇㅈㄹ;
왜 없어? 지금 당장 코드에 void(123); 써봐.
ㅅㅅㅅ 군? 포인터 연산이 필요한건 배열처럼 접근하기 위해서지?
배열처럼 접근한다는건 크기의 단위로 접근한다는 것이고?
글쓴이 // 주소 창에서 javas\0cript: 쓸 때 값이 있는 식이면 문서 자체가 바뀌기 때문에 javas\0cript:void(document.title = 'hello'); 식으로 많이 쓴다.
codesafer // 그렇죠.
원래 포인터 개념이 배열에서부터 유도된 것이니까요. B언어 시절에는 포인터 선언도 int ptr[]; 식으로만 썼었고.
int *ptr; 스타일은 C언어로 오면서 비로소 표준화가 된 것이죠.
void* 의 void 는 무가 아니야. 정해지지 않음이지. void 리턴값이나 인자의 void 와 다르다구.
접근할 단위가 없는 포인터는 의미가 없는거지. 곧 define 돼.
성님 성님이 말씀하시는 건 저도 다 이해하고 있어요. 다만 저는 체계를 바꿔서 간단하게 설명하고 싶다는 거예요.
즉, 포인터 연산의 단위로의 해석이 옳다고 봐. "크기를 가리킨다" 는 표현은 적절치 않아.
내가 어떤 표현에 기꺼워하는지 알겠지?
포인터는 메모리 주소만 가지고 있다라고 주장하는 건 순전히 값의 레벨에서만 바라볼 때의 얘기에요. 언어 문법적 성질까지 모두 고려하면 범위를 가리킨다고 설명하면 깔끔해요.
에요 => 예요
가리킨다란 단어를 아이들이 흔히 쓰는데, 그 의미도 겨우겨우 붙잡고 있는데 중의적으로 만들고 싶지 않다는거야.
주소만 가지고 있다고 말한적이 없어. 난.
형님은 void를 두 가지로 보고 계시는데. 제 정의대로라면 void는 無 = 0바이트로 하나만 정의해도 돼요.
포인터 연산의 단위를 명시하기 위해 타잎을 적는다고 한거지.
아 가지고 있다 => 가리키고 있다
코세형말처럼 void는 무가아니라 정해지지않앗다는게 맞는거같음. void 포인터도 사실상 어떤ㄴ자료형의 포인터값을받고 그것을 실제출력하기위해선 define을 해줘야됨. 그래서 무가아님 병신아
근데 수직선 그어서 생각해 보면 제 정의가 더 깔끔하게 와닿지 않으신가요?
범위가 0바이트면 범위가 아니라 점이라는 거고 그래서 더하기나 빼기가 안된다는 것.
곧 수직선 상의 눈금 자체가 되는 것.
두가지 다의 의미로 써 글쓴이야.
void 는 none 이기도 하고 not defined 이기도 해.
반면 char *는 눈금이 아니라 1바이트만큼의 범위를 가리키고 있으니 더하고나 빼면 이동할 거리가 결정되어서 더하거나 뺄 수가 있는 것.
void가 not defined라는 건 저는 동의하기가 어렵네요. 자바스크립트에서도 undefined 따로 있고 void 따로 있죠.
영어 단어의 의미도 無, 虛고요.
C/C++ 을 이야기하고 있는거야.
것도 C 에서의 의미와 C++ 에서의 의미가 달라지지.
결국 성님이 void가 not defined라는 것의 C/C++에서의 예는 pointer 밖에 없잖아요? 그럼 pointer 만 예외가 되는 거 아닌가요?
그게 좀 부당하다는 것이죠.
void* 인자의 함수에 char* 를 넘기기 위해 캐스팅을 하고 그걸 받느라 다시 char* 단위로 캐스팅을 해야 되는게 웃긴 C++ 이구.
과거의 의미는 아직 정해지지 않은걸 허용한다. 라는 의미였지.
그래서 두가지 다 의 의미로 쓰고 있다고 하는거야.
예외가 아니라. 둘 다 쓴다. 언어에서.
ㅅㅅㅅ// 아니내말씹지말고들어봐바 ㅡㅡ 코세형말이맞다니까? void *vptr; int *p; *p =5; vptr = p; 이제이걸출력할려면 정의(캐스팅)을해줘야된다고병신아 printf("%d", *(int*)p);
ㅋㅋㅋㅋ 글쓴이 니가 들어올 레벨의 대화는 아냐 이건 말다듬기지 개념이 맞다 틀리다의 수준이 아님.
우린 선수들이라 서로 언어순화하자고 이러는거라.
codesafer // C++에서 캐스팅이 필요한 건 void * -> type *일 뿐이지 type * -> void *는 묵시적 변환이 돼요. 물론 C에서는 둘 다 묵시적 변환이 되고.
콧게ㅐ// 시발 글무룩
뭐 성님께서도 ptr = (type *) malloc(...); 꼴은 C++에서나 필요하지 C에서는 필요 없다는 건 잘 아시는 듯한데. realloc(ptr, size); 에서 ptr를 void *로 캐스팅할 필요 없는 건 C, C++ 불문하고 다 같아요.
그래서 memcpy, memmove 같은 함수들은 C++ 에서 과거에 가졌던 C 의 편의성이 사라졌어. 존나 좆같음.
성님 말씀에서 "void* 인자의 함수에 char* 를 넘기기 위해 캐스팅을 하고"가 틀렸다는 얘기를 하고 있는 거.
type * -> void * 로의 묵시적 변환은 C든 C++든 모두 돼요.
type * -> void * 로의 묵시적 변환은 C든 C++든 모두 돼요.
type * -> void * 로의 묵시적 변환은 C든 C++든 모두 돼요.
안되는 컴파일러도 많아용.
네트워크 순간적으로 맛이 갔었네 ㄷㄷ 암튼...
물론 과거엔, void foo(void) 함수와 void foo() 함수도 구별하는 별 웃긴 컴파일러도 있었고.
응? 저는 표준에서 되는 걸로 알고 있는데요. 그럼 그 컴파일러가 이상한 것 :) gcc/g++에서 -Wall -pedantic-errors 걸어놓고 해 보면 오류 전혀 안나는 걸 예전에 확인했었거든요. 표준에 맞는 코드라는 거죠.
void foo(void), void foo()는 구분하죠. 지금도. C에서는. C++에서는 구분이 사라졌지만.
void foo()는 B언어 스타일의 선언이고 void foo(void)가 매개 변수 없다는 의미의 C언어 스타일의 선언이죠.
C++에서는 그냥 (void)랑 () 구분하는 건 old한 부분이니깐 아예 없애버렸죠. 둘 다 인자 개수 0인 의미라고.
하지만 C 컴파일러에서는 B style의 선언인지 C style의 선언인지에 따라 동작 방식이 달라지기 때문에, void foo() 로 쓸 경우 함수 호출 시 인자 개수 체크를 전혀 안하게 되죠.
암튼, 포인터는 포인터 연산에 집중해서 정의하는게 옳다. 가리킨다의 중의적 표현은 바람직하지 않다.
ㅅㅅㅅ// 진짜깐깐하ㅔㄴ.... 시발징그럽다... 너초1떄부터 코딩햇다며 , 시발학교->집코딩 이걸 10년넘게한거? 진짜구역질나온다 니실력은부럽지만 인생은안부럽다 시발;
착각하지마. 뭐 오타쿠처럼 하루종일 코딩만 한 건 당연히 아니고. 오히려 어려서부터 했으니깐 코딩도 생활의 일부분이 되어서 다른 생활들도 함께 하면서 코딩을 할 여유가 된 거다. 늦게 했으면 이 실력까지 오는데 하루 종일 코딩만 했어도 힘들었겠지.
앎을 향할때 깐깐해도 된다. 어떨땐 미덕이다. 친구들 앞에서만 그러지 않으면 돼.
이시발련아 구라치지마 니 말하는거보니까 시발개찐따처럼 코딩만한 스멜이 이빠이나는데 어디서개구라를칠려함 ㅡㅡ 그리고 그렇게하나하나에 미친듯이 파본결과가머임? 생산성이좋아짐? 코드를더잘짜게됨? 아닐텐데 결국 자기만족아님? 그리고 니가연구한 결과를 이렇게 표출함으로써 자기만족은 200%에 도달하는거아님? 결국이게끝이잔아 결론은 아무리하나하나깊게따져도 기본기만아는사람이랑 결과물은 차이없을텐데
코딩만 주로 하긴 했지만. 그 와중에 여행도 가고 친구도 만들고 여자친구도 사귀고 할 건 다 했다 ㅎㅎ
깊게 알 때 더 잘 짜지는 경우도 있고. 문제가 생겼을 때 지식의 깊이가 문제 해결의 키가 되는 경우도 종종 있다.
뭐 바보같이 짜서 대충 돌아만 가면 되는 기준이라면 니 말대로 큰 차이 없겠지.
하나하나 미친 듯이 파는 건 좀 나이 먹고 나서이고. 어릴 땐 나도 너처럼 대충대충 배웠지. 초보 땐. 다 그러면서 크는 건데. 뭘. 나는 짬밥이 쌓이다 보니 어느 순간 확실한 걸 좋아하게 되더라. 성격 자체가.
한 중딩 때부터 확실한 것을 좋아하게 되었다고 보면 됨. 고딩 때부턴 절정을 이루었고.
니미지랄 꺼저걍
초딩 땐 허무송도 만들고. 또 초중딩 땐 스타 맵 만들기에도 빠져봤고. 폭피 같은 거 만들면서. 나도 니네들이랑 크게 다르지 않는 어린 시절 보냈다. 컴퓨터에 좀 더 관심이 많고 프로그래밍을 일찍 시작했다는 거 뺴고 말야. ^^
니미지랄은 니고. 넌 그냥 자살이나 해라. 진지하게 말을 해도 안 믿는 안 듣는 한심한 새끼.
아무튼 이 엉아는 자러 간다. 그럼 수고.