그니까 포인터 이론이나 이런 구체적인거말이지.
msb부호비트나 왼쪽으로쉬프트연산하면 2배가된다거나,
char a=12;
int a=12;
두개중 int가 시스템연산비트(한번에연산가능한 비트)에 따라 크기가 달라지기때문에 속도면에서 더효율적이라던가
지역매개변수는 스택영역에저장되서 리턴되면 소멸된다거나.(스택포인터가 변경되 덮어쓰우는건가 어셈에서는)
배열이름은 첫요소의 주소값을 의미하기도한다는등
한 400페이지 넘게 했다.
물론 9할 8푼 이상 다이해됬고
독학으로
진도빠른편인가?
ㄴㄴ 아 맞그런거같아 성우형님책인데 ㄱ점에대해서 자세히안설명되있어서 잘몰랐다
???
kukyak // 글쓴이 말이 맞다. 연산속도 다름 물 요즘 컴파일러는 최적화 해주긴함
예제같은거 풀어보면서 저렇게한거면....진짜 대단한거아님?
그리고 표현이 살짝 이상하긴 한데 배열이 첫주소 의미하는거 맞아 그리고 2차원 배열도 1차원 배열임
배열 -> 배열 이름
ㄴㄴ 그 int형으로변환하고 다시 char형으로변환시킨다고 안다나는
그걸 뭐라고했던데..
잠깐만
ㄴㄴ 응 ??? 자세히 말해줘바 ㅋㅋ
정수의 승격 integer(Integral) promorion 이적용된다네
promotion
ㅇㅇ 맞아
int 형이 가장 빨라서 최신 컴파일러는 char형을 int로 바꿔준다고 알고 있음
참재밌어 c언어가 은근히 제작자의 배려? 가숨어있으
ㅇㅇ
그 주소표현방식에서도
무슨 연산속도 얘기를 하면서 정수승격을 얘기하고 앉았냐 전혀 다른 얘기여 두개는
주소표현단위도 시스템비트에따라 늘어나드라고
char형을 int형으로 알아서 바꾸는 컴파일러가 있으면 그건 표준 C 컴파일러가 아녀. 뭔 말도 안되는 소릴하고 앉았대
int가 연산이 제일 빨라서 정수로 승격시켜 주는거야
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
물론 컴파일러가 지맘대로 바꾸지는 않지. 문제가 없을경우 int 크기를 할당해 주는거야
배열이랑 포인터랑 따로 설명해야하는데 요새 책들이 배열을 포인터로 설명하나
그래서 포인터할때 주소값은결국엔 숫잔데 int형의 크기도 시스템의 비트니, 포인터의 크기는 결국 int형의크기라는걸 알게됨 두둥!
일차원배열은 포인터맞다던데
배열이 포인터랑 다른점이 뭐가 있어?
아니
2차원 배열도 사실 1차원 배열이얌
int로 할당 같은 소리하고 있네. 레지스터 쓰는거면 애초에 할당할 필요도 없다 븅시나. 뭐 전혀 다른 얘기를 지맘대로 섞어서는 헛소릴하고 있냐
ㄴㄴ ㅇㅇ 2차원배열 1차원배열 두둥
그럼 64비트에서 기본 레지스터 단위로 처리할라믄 int를 64비트로 하지 왜 32비트로 하겠냐? 애초에 표준에서는 int가 몇바이트인지 명시도 안하는구만
아니 1바이트 크기를 4바이트로 할당해서 바이너리코드로 변환한다고
배열이 포인터랑 다른게 뭐냐는 질문에서 어처구니가 없다. sizeof("Hello World"); 하면 뭐가 나올 것 같냐? 배열이랑 포인터랑 구분 못하는것들이 꼭 4나 8 대답하지 ㅉㅉ
근데 레지스터도 cpu안에 있는거 아닌감?
표준에서 int가 몇바이트인지 명시 안하는게 맞음
아키텍쳐마다 달라지니까
왜 hellow world 하면 값이 달라지냐면
흠 근데 sizeof이 소스코드가 어떻게 생겼지?
궁금하네 보고옴 ㅋㅋ
상수도결국주소로 저장되는거아니야? printf("hello"); 이리되면 hello의 주소값을 참조하는거아닌가? 그러면 결국 n비트시스템이면 n바이트(int형)크기아닌감?
sizeof("hello")는 sizeof(int) 아니얌?
오홍 sizeof은 런타임 함수가 아니라서 컴파일 시에 계산된다네 신기
런타임함수가뭐야?
던가->든가
그거 잘 모르겠음 ㅋㅋ sizeof(struct A) 하면
구조체 크기 나오자나
되서->돼서
되->돼
소스코드가 기존에 있는게 아니라 매크로처럼 컴파일시에 계산이 됨
됬-됐
ㅇㅇ//이여도->이어도
ㅇㅇ//되있->돼있
ㅇㅇ 고맙다
ㅇㅇ 근데 뭐하냐
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
sizeof는 함수도 매크로도 아니고 operator다. 뭔 자신감으로 댓글 달았냐 ㅋㅋㅋ 좆나 급 허무해지네
그렇네 처음 알았음 container_of 같은건지 알았지 ㅋㅋ
근데 sizeof이 포인터 배열에서 왜나왕?
int a[3] = {0, }; int *b = a; 에서 a의 타입은 int[3]이고 b의 타입은 int*여. 배열을 포인터'처럼' 쓸 수 있는건 배열이 포인터로 "decay" 되기 때문이고 이에 대해선 array decays into pointer로 검색하면 설명 많이 나온다. sizeof(a)를 하면 sizeof(int[3])이니까 3*sizeof(int)라 보통 12가 되는거고 sizeof(b)는 sizeof(int*)라서 4나 8이 된다. 배열이 포인터라면 sizeof(a)랑 sizeof(b)가 같아야겠지
음 그말이 맞넹
배열이랑 포인터가 메모리상에서는 동일하게 저장되는데, 컴파일러가 처리할때 다른점이 있군
2차원 배열도 1차원 배열이라고 얘기하면 안돼. 메모리상의 layout이 같다고 해서 타입이 같은건 아님. 배열이랑 포인터랑 같다고 생각하면 void f(int** ptr); int a[2][3]; f(a) 같은 말도 안되는 코드가 나오고 예상치 못한 segfault에 머리 싸매고 디버깅하겠지.
그래서 배열 이름을 포인터처럼 바로 이용하는것보다 &a[0] 이라고 취하는게 가독성 면에서도 더 낫다. C++은 & operator도 오버로딩이 되기 땜에 std::addressof(a[0])으로 쓰는게 젤 나음.
?? 위의 예시는 그냥 포인터 개념을 이해 못한 코드아닌감?
2차원 포인터랑 2차원 배열에서 차이가 많이 발생하는게
사실 2차원 배열은 1차원 배열과 다를바 없는거를 인간이 보기 쉽게 바꾼거고, 2차원 포인터는 말그대로 2차원 포인터니까
배열이름은 상수형태의 포인터아니야?
int a[2][3] 는 int[3]가 2개 있는 배열이고, int[3]은 int가 3개 있는 배열이야. 그냥 배열이랑 포인터가 같다고 생각하믄 안됨. 배열 타입에는 dimension 정보도 담겨 있기 때문에 두개를 별개로 생각해야하고, 배열->포인터의 암묵적 변환를 따로 이해해야함.
그러면 2차원 배열과 1차원 배열이 코드상에서 확 달라지는 부분이 뭐가 있지? 그리고 &a[0]는 2차원 포인터 아닌감?
int arr[3]={1.2.3}'
*arr++;
이런식으로 접근가능하는데 결국 type 1차원 배열의 type형포인터라는건맞지않나?
아 다른 2개를 설명하면서 a라고만 썼네. int a[3] = {0,}; 에서 a의 첫번쨰 원소를 가리킬 때 a라고 쓰는것보다 &a[0]이나 std::addressof(a[0])으로 쓰는게 더 낫다는 의미였어.
*arr++;이 컴파일 되는지 해보고 와.
혹시 참조만할수있나?
컴파일 왜 안돼?
그릏군 printf("%d",*arr); 같이 참조는할수있잖아
결국 arr이란 단어(배열이름)은 주소값을담고있다 라는거아닌가
그대신 상수형태이기때문에
딱히 세그폴트 뜰거같진 않은데
가르키는 포인터값을 변경할수없는거고
아 담고있다라기본단 그자체? 내포하고있다 인가
응? 가르키는 포인터 값을 변경할 수 있어
arr++ 하면 포인터 값이 바뀌는 거지 뭐
그런듯
근데 포인터처럼 주소를 변경시킬순없다는것같아
난 지금도 초보한테 c 부터 가르치는거 이해불가. 언어차원이랑 구현차원의 경계가 희미하고 뒤섞인데다가 그런걸 교묘하게 이용까지 하는 언어라, 프로그래밍 언어에 대한 개념이 아직 없는 초심자가 이걸로 플밍언어 공부하면 주화입마에 잘 빠짐.
ㄴ 나는 기본적으로 웹프밍이되니까 ㅎ
ㄴ written in c
아 근데 웹은 c로 짜보다가 미칠뻔 ㅋㅋㅋ
배열/포인터도 타입개념만 제대로 알고있으면 나머지는 그냥 디테일(c 특유의 coercion)의 문제임.
아니라고 arr이 주소값을 내포하는게 아니라고...... 후 시발 array to pointer 변환 어떤 개새키가 이걸 넣어서는 아오 시발 아오
그냥 c 문법적인측면이냐?
빠르게 배우는것도 좋지만 빠르게 잊어버릴수도 있으니 앞의내용도 꾸준히 보는거 추천
ㄴ그래서 그것때문에 불안해서 꿈속에서도 되짚는다 리얼 ㅋㅋ
??? arr에 주소 값이 없어?
arr printf로 찍으면 배열 첫 주소 나오지 않나?
그럼 포인터처럼 갖고 놀면 되는거 아닌감?
아조시들.... 박식해요....