C 포인터 기초 정리

포인터 배우기전에 알아두면 좋은것

하기전에

메모리 구조

int=4byte char=1byte float=4byte double=8byte
를 가진다

포인터는 일단 메모리를 저장할수 있는 변수이다
그러므로 포인터변수는 주소를 저장한다(당연하지?)
그럼 그 주소만 가지고 어떻게 데이터를 뽑아올까?

int *a;(여기서 a는 포인터 선언입니다., 주소를 참조한다느게 아니에요)
int b=10;
a=&b;// 여기서 a는 b의 첫째주소 즉 7을 가진다(b의 주소를 a에 대입하므로)

앞에서도 적었듯이 이러면 a는 b의 주소를 가지게 된다(맨앞의)
또한 앞에서 적었듯이 int는 4byte를 가진다고 했다.

a-------- b--------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
===10====

* 각 숫자는 메모리의 주소라고 가정하자 *
* ---는 차지하는 크기이다

printf("%d\n",*a); //이러면 a가 가진주소에서 대상체만큼 (일차원이므로)
4byte 만큼 읽어들인다 여기서 포인터는 주소를 참조합니다 선언부가 아니기 때문에

그럼 그 4 byte 안에 10라는 자료가 있다는것이다

(*)

해당 변수가 가지고있는 주소로부터 해당변수가 가지고 있는 대상체만큼의
바이트수를 읽어들여서 대상체들이 가지고 있는값들을 값으로변환

(&)
해당변수의 자체 주소값을 불러냄
ex> a=&b 포인터변수 a 는 b의 주소(처음)을 가진다

#include "stdio.h"
int main(int argc,char *argv[])
{
int *a; // a 가 바로 포인터 변수
int b=3;

a=&b; //포인터 변수 a는 b의 자체 주소를 대입시킴

printf("%d\n",a);
printf("%d\n",*a);

이프로그램?을 그냥 쓰면 에러가 날것이다..
왜냐하면 잘 보도록 (}가 빠졌다!!)
결과는 알아서 판단하기를 (컴파일하면 나올테니..)

1 메모리 주소만을 저장가능

int *a=&3 같은것은 불가(3이 상수이므로!)

2 포인터는 항상 4바이트를 가짐

종류 sizeof(x) 대상체(포인터가 가진 주소로부터 몇바이트 를 읽어 내는가?)
int *a 4 4
char *b 4 1
double *c 4 8
float *d 4 4

~변수의 타입이 다르더라도 포인터 자체의 크기는 같다..~

3 받을려고하는 변수의 대상체와 포인터의 대상체가 같아야함

일차원일경우는 별생각 안해도? 되긴하지만
2차원인 경우엔..(이건 나중에 할게.. 좀 길거 같애;;)

4 배열을 포인터의 일종이다 (상수포인터==배열)
4번에따라 배열을 포인터로 변환할수 있다

a[3]==*(a+3), a[2][1]==*(*(a+2)+1)
즉 a[x]==*(a+x)라는 공식이 성립한다

좀더 확장하자면 a[0]==*(a+0)==*a (일차원일때만.뭐 이게 1차원이지만)

포인터도 배열처름 쓸수도 있다.

5,포인터와 증감연산자


보통 증감연산자(++,--)는 1 씩증가하는데..
포인터에선(가진주소를) 1씩 증가하는게 아니라 포인터 변수의 대상체만큼 (가진주소) 를증가시킨다

ex> int *a;
~
a++;
이거면 a가 가진 주소에서 4byte를 증가시켜서 a에 그 값을 저장한다는 뜻임(
(int 의 대상체가 4byte이므로,,)

6.포인터는 꼭 초기화를 하자!

포인터 초기화를 하지 않는다면 포인터안에 쓰레기 값이 들어가 그 값을
참조하게 되어 오류를 낼가능성이 있다.

주>
argc,argv-> 예들들어서 ls -a를 한다면
이럴때 argc==2가 이고 argv[0]=ls argv[1]==-a가 입력되는 식이다
sizeof연산자 -> 대상의 크기구함
타입케스팅-> 변수의 타입을 변화시켜줌 ex> (int)a

개인 정리용? 임.. 잊어버릴까봐 대충 정리함
쓰고 나니까 엄청나게 길어지는구나!
혹여나 틀릴수도 있으니까 100% 신뢰는 마시고..
(최대한 맞다고 생각하고 ㅤㅆㅓㅅ는데..;;)