'Programming/C'에 해당되는 글 22건

  1. 2006.12.15 iconv 함수 사용법.?!
  2. 2006.03.06 C 포인터 기초 정리 (3)

iconv 함수 사용법.?!

iconv_t cd;
cd=iconv_open("EUC-KR", "UTF-8"); //from:EUC-KR to:UTF-8


size_t in_bytes = strlen(str), last_bytes;
char *out = (char *) malloc(ICONV_BYTES(in_bytes));
char *outp = out;
size_t out_bytes = ICONV_BYTES(in_bytes);
do {
int n;

last_bytes = in_bytes;
n = iconv(cd, (char **)&str, &in_bytes, &outp, &out_bytes);

}
} while (in_bytes > 0 && in_bytes < last_bytes);
iconv_close(cd); //문자 로케일 cd
Trackback 0 Comment 0

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% 신뢰는 마시고..
(최대한 맞다고 생각하고 ㅤㅆㅓㅅ는데..;;)
Trackback 0 Comment 3
  1. Favicon of http://lsm1987.dothome.co.kr/ BlogIcon 에그 2006.03.08 21:35 address edit & del reply

    질문이 있소!!
    소싯적 본인은 int *a를 "Int *"라는 명령어가 a라는 포인터 변수를 선언한다는 식으로 생각했는데,
    이게 계속 밀고나가도 무리가 없는 사고방식인지 알고 싶소...

    • Lowid 2006.03.08 21:57 address edit & del

      int *a,int * a,int* a,모두 가능한걸로 아오.
      걍편하고 보기 좋은거 아무거나 써도 될거 같오

    • Lowid 2006.03.08 22:02 address edit & del

      처음에 int *a 이렇게 하는건 a라는 포인터 변수를 선언하는거라오
      그러나 선언부(위부분) 제외하고는 주소를 참조한다는 뜻 이오

prev 1 2 3 4 5 next