C 포인터 기초 정리
Programming/C 2006. 3. 6. 18:14
포인터 배우기전에 알아두면 좋은것
하기전에
메모리 구조
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% 신뢰는 마시고..
(최대한 맞다고 생각하고 ㅤㅆㅓㅅ는데..;;)
하기전에
메모리 구조
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% 신뢰는 마시고..
(최대한 맞다고 생각하고 ㅤㅆㅓㅅ는데..;;)
'Programming > C' 카테고리의 다른 글
c언어로 구현한 mp3 태그(id3v2) 지우기 (6) | 2007.05.06 |
---|---|
pointer 를 call by referance 하기 (6) | 2007.04.09 |
프로세스 갯수 알아내기.. (4) | 2007.03.06 |
libconfuse 에서 *** glibc detected *** double free or corruption (0) | 2007.02.22 |
iconv 함수 사용법.?! (0) | 2006.12.15 |