아까랑 같은 사진이고
코딩목표는 몇개입력할지 숫자를 N에 입력
그리고 영어단어를 입력해서 사전순으로 출력하는게 목표
예)
apple
peach
banana 입력하면
apple
banana
peach
출력하는게 목표
궁금한점이 주석처리한 36번째 줄임
2차원 포인터에서
*(p+i) 하고 p+i 하고 뭔차이가 있는거야?
*(p+i) 하면 제대로 값이 출력되고
p+i 하면 글자 깨지는 쓰레기값 출력되는데 답변좀 부탁드리겠습니다
아까랑 같은 사진이고
코딩목표는 몇개입력할지 숫자를 N에 입력
그리고 영어단어를 입력해서 사전순으로 출력하는게 목표
예)
apple
peach
banana 입력하면
apple
banana
peach
출력하는게 목표
궁금한점이 주석처리한 36번째 줄임
2차원 포인터에서
*(p+i) 하고 p+i 하고 뭔차이가 있는거야?
*(p+i) 하면 제대로 값이 출력되고
p+i 하면 글자 깨지는 쓰레기값 출력되는데 답변좀 부탁드리겠습니다
포인터에서 *붙이면 해당 포인터가 가리키는 값 그자체가 출력되고 *안붙이면 주소값이 출력되는거랑 관계있는거 아닐까!
사실 C 안잡은지 너무 오래돼서 잘 모름!
그건 1차원 배열이고 2차원 배열에서 *(p+i) 하고 p+i 하고 차이점을 모르겠음
아하! 내가 바보였구나!
아.. 장난하지말고 제발좀 알려줘라
근데 2차원배열이라고 그게 달라지나?
1차원 2차원 3차원..n차원은 사람입장이고 컴퓨터 입장에선 다 똑같이 선형으로 데이터 저장하는건데
똑같은거 아님? *(p+i) 에는 단어가 저장된 메모리의 주소값이 들어있는거고 p+i 는 배열의 주소값 자체지. char **p 를 동적할당 한거면 포인터를 저장할 배열을 만든거라고 생각하면되는거고
char** 타입은 문자열이라는 가상의 타입의 포인터(인데 배열처럼씀) 이라고 볼수있음. 그리고 *(p+i)는 포인터연산후 내용물을 꺼내오는건데 p[i]랑 동치임. 이정도면 이해감? - dc App
p+i는 char**에 포인터연산한건데 배열을 그대로 출력할수없자나 - dc App
일단 나는 이렇게 char*이라는 타입을 이해했음. 딴사람들은 설명이좀다를수도있어 - dc App
p+i는 그냥 주소값 p에다가 i를 더한거고 *(p+i)는 주소값 p에다가 i를 더하고 그거의 내용물을 꺼낸다?
ㅇㅇ char*은 포인터가아니라 문자열을 담는 무언가로 봐야됨 char**이 문자열의 포인터임 - dc App
그리고 포인터연산으로 i가더해질때는 포인터가 가리키는 타입만큼 주소값이 i*sizeof(타입)만큼 늘어남. 그래서 안심하고 +i를 쓸수있는거임 - dc App
int가 4바이트라고하면 3바이트에서멈춰서꺼내면 좆될거아니야 그거방지용 - dc App
궁금한게 2차원 배열이라서 p+i 하고 *(p+i)는 둘다 주소값이잖아 값을 쓸려면 2차원 포인터니 **(p+i) 이런식으로 써야되고 p+i는 p에다가 i를 더한거면 *(p+i)는 뭘 나타내는거야?
아니 *(p+i)는 문자열타입이란다 친구야 너가 %s로 불러올수있는거 - dc App
그러니까 char**은 사실상 1차원구조임 - dc App
엄청간단하게말하자면 그렇게됨 ㅇㅇ char**은 문자열의 포인터(인데 배열처럼쓰는거) - dc App
pritnf("%s, 주소값) 이잖아 p+i 도 주소값이니 되는거 아니야?
그게 실제주소가아니라 문자의 배열, 즉 문자열이라구 근데 문자열의 배열은 주소값이라해도 문자열이아니지 - dc App
char*를 가상의 타입 str뭐이런걸로 치환해서봐봐 그러면 2차원배열이 나올수가없음 - dc App
문자의 2차원 배열이긴한데 문자열의 1차원배열로 생각할수있잖아 그럼 한결 이해가편해짐 - dc App
2차원 3차원도 결국 1차원으로 선형으로 저장한다는건 알겠는데 내가 궁금한건 *(p+i) 가 뭘 뜻하는지 이게 궁금하다는거지
ㅇㅋ p라는 배열의 i번째 인덱스에 있는 문자열이야 - dc App
아 p+i 는 그냥 주소 연산한거고 printf("%s,주소값) 인데 주소값이라도 문자열인 주소값이 와야되는거니 그냥 주소를 넣는게 아닌 *(p+i) 문자열인 주소값을 대입해야되서 *(p+i)를 써야되는거야?
ㅇㅇ맞아 - dc App
왜이렇게 빡세냐 넌 포인터 뭘로공부함?
입문서 두어개 정독함 포인터는 추상적인이해가 뒷받침해야돼 이건 포인터가 왜이렇게작동하는지 생각해봐야 자신만의 방법으로 배우기쉬움 - dc App
답변 고마워
p에 주소값이 들어있고, 예를들어 0x20에 있다고 하면 p + 1하면 0x21되겠지 - dc App
그래 이거지 질문자 좀 이상함 포인터 잘 모르는거같은데?
나도 이렇게 생각했는디
그림으로 그려서 설명하는게 좋을거같워 - dc App
p+i 하고 *(p+i) 하고 둘다 주소값이잖아 2차원 배열이니 값을 쓸라면 **(p+i)를 해야되는거고 p+i는 p에다가 i더한거면 *(p+i)는 뭐야?
문자열, 스트링을 담고있는 char*니까 그냥 읽으면 apple이 되겠죵 ㅎㅎ **접근하면 a, p, p, l, e 한글자씩에 접근하는게 되는거임
아 p+i 는 그냥 주소 연산한거고 printf("%s,주소값) 인데 주소값이라도 문자열인 주소값이 와야되는거니 그냥 주소를 넣는게 아닌 *(p+i) 문자열인 주소값을 대입해야되서 *(p+i)를 써야되는거야?
p+i는 banana를 담고있는 변수의 주소값, *(p+i)는 "banana" 이건 배열 좀 공부해보시고ㅎㅎ **(p+i) == 'b'
그럭죠 철수 불러달랬더니 철수 집주소 말해주는꼴이니
철수 집에 가서 직접 철수를 불러야지
글 하나 썼음 위에
p+i 나 *(p+i)나 banana 의 첫글자인 b의 주소를 뜻하는데 printf("%s",주소값) 으로 표현해야하므로 문자열의 주소값인 *(p+i) 를 써야된다는거지?
맞워요 - dc App
정확히는 원인 결과를 반대로 설명한거같지만 아무튼 맞음 - dc App
원인과 결과를 반대로 설명했다니 뭔말이야 설명좀? 제대로 이해하고싶음
문자열이 그리 생겨먹었기 때문에 printf의 인자에 주소값이 들어가는것이다 - dc App
ㅇㅇ 답변고맙다
p+i는 2차원 배열이다. 여기까진 너도 알겠지. 그럼 *(p+i)는 1차원 배열이다. 그리고 **(p+i)는 원소다
그렇게 생각할수도 있겟네 문자열 자체가 1차원 배열이니 *써서 차원을 낮추는식으로
그런데 C에서 문자열은 1차원 배열이다. 따라서 *(p+i)가 정답. 끝
답변고마워