'-포인터'에 해당되는 글 13건

  1. 2008.07.30 비트 연산자 정리
  2. 2008.07.30 입출력 함수 정리
  3. 2008.07.20 포인터와 구조체

& : 각 비트별로 '&' 연산 수행

| : 각 비트별로 '|' 연산 수행

^ : 각 비트별로 '^' 연산 수행, 비트 1의 개수가 홀수이면 1 짝수이면 0.

~ : 보수

<< : 1bit씩 왼쪽 이동 하위 비트는 0으로 채움 2를 곱하는 특징.

>> : 1bit씩 오른쪽 이동 상위 비트는 부호 비트로 채움 2를 나누는 특징. 여러번 호출하면 -1이 됨.

 

short n=0x4241;

 

printf("%x\n",(unsigned char)n);

printf("%x\n",(unsigned short)n >>8 & 0xFF);

 

출력결과

41

42

 

n를 char형으로 형변환 하위 1byte만 남게 되고 상위 1byte를 8bit 오른쪽으로 쉬프트한후 0xFF와 &하면 상위 1byte출력

int형 경우 (unsigned int)n >> 16 & 0xFFFF)하면 된다.

 

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;

#define MAKEWORD(x,y) ((BYTE)x | (WORD)y << 8)
#define MAKEDWORD(x,y)((WORD)x | (DWORD)y<<16)

int n=0;

n=MAKEDWORD(MAKEWORD(0x41,0x42),MAKEWORD(0x43,0x44));

printf("%x\n",n);

 

출력결과

44434241

 

 

 

'-포인터' 카테고리의 다른 글

비트 연산자 정리  (0) 2008.07.30
입출력 함수 정리  (0) 2008.07.30
포인터와 구조체  (0) 2008.07.20
구조체와 공용체  (0) 2008.07.16
포인터와 문자열II  (0) 2008.07.16
포인터와 문자열  (0) 2008.07.11
Posted by hyunny82

getch() : 한 문자를 키보드에서 입력받음

getche() : 한 문자를 키보드에서 입력받고 화면에 문자를 보여주는 함수

getchar() : 버퍼 사용 문자입력받고 한 문자 반환. \n입력할때까지 버퍼에 문자입력. 그중 첫째 문자 반환.

putchar() : 한문자를 화면에 출력

fgetc() : 파일 입출력 함수. 한 문자를 입력 받음 인자로 파일 포인터를 주면 파일에서 문자 입력받고 stdin을 주면 키보드에서 입력받음

fputc() : 파일 입출력 함수로 한 문자를 출력. 첫 번쨰 인자로 아스키 값과 두 번째 인자로 파일포인터를 주면 파일에 한 문자출력.

             stdout을 주면 화면에 출력

fscanf() : 파일 입출력 함수로 가변 인자를 사용 입력.

fprintf() : 파일 입출력 함수로 가변 인자를 사용 출력.

gets() : 문자열 입력 함수로 입력받을 버퍼의 시작 주소를 주면 버퍼에 문자열을 입력받을 수 있다.

puts() : 문자열 출력 함수로 시작 주소를 주면 문자열을 출력.

sscanf() : 버퍼 입출력 함수.

sprintf() : 버퍼 입출력 함수.

 

'-포인터' 카테고리의 다른 글

비트 연산자 정리  (0) 2008.07.30
입출력 함수 정리  (0) 2008.07.30
포인터와 구조체  (0) 2008.07.20
구조체와 공용체  (0) 2008.07.16
포인터와 문자열II  (0) 2008.07.16
포인터와 문자열  (0) 2008.07.11
Posted by hyunny82

struct _string s1{ char str1;char str2[8];},*ps 있다고 가정

 

s1: 구조체형의 메모리(변수)의미

ps: 구조체형의 포인터 변수를 의미

s1.str1: 구조체의 멤버인 str1 char형 포인터 변수(문자열의 시작 주소)이다.

s1.str2: 구조체의 멤버인 str2 char형 배열의 시작 주소(문자열의 시작 주소)

s1.str[1]: s1.str1이 문자열의 시작 주소(포인터)이므로 s1.str1[1]은 두 번쨰 문자 의미

s1.str2[1]:s1.str2가 문자열의 시작 주소(배열 이름)이므로 s1.str2[1]는 두 번쨰 문자를 의미

*(s1.str1+1):s1.str1이 문자열의 시작 주소(포인터)이므로 *(s1.str1+1)은 두 번째 문자를 의미.

*(s1.str2+1):s1.str2가 문자열의 시작 주소(배열 이름)이므로 *(s1.str2+1)은 두 번쨰 문자를 의미.

ps->str1: ps가 가르키는 구조체 멤버의  str1을 의미. char형 포인터 변수.

ps->str2: ps가 가르키느 구조체 멤버의 str2를 의미. char형 배열의 시작주소.

ps->str1[1]: str1의 두 번쨰 문자.

ps->str2[1]: str2의 두 번째 문자의미

*(ps->str1+1): ps->str1이 문자열의 시작 주소. 두 번쨰 문자를 의미

*(ps->str2+1): ps->str2이 문자열의 시작 주소. 두 번째 문자를 의미

*ps.str1[1]: '.'연산자가 '*' 연산자보다 우선 순위가 높으므로 문법 에러 발생. 구조체 포인터는 ->로 접근

                  (*ps).str[1]으로 바꾼다면 두 번째 문자를 의미

*ps.str2[2]: *ps.str1[1]과 동일

&s1.str1: char형포인터 변수 s1.str1의 시작 주소

&s1.str2: car형 배열 이름의 주소.

&s1.str1[1]: 포인터(str1)가 가리키는 두 번째 문자의 주소 의미

&s1.str2[1]: 배열 이름(str2)으로 시작하는 두 번째 문자의 주소 의미

&ps->str1: char형 포인터 변수 ps->str1의 시작 주소.

&ps->str2: char형 배열 이름의 주소를 의미.

&ps->str1[1]: 포인터(str1)가 가르키는 두 번째 문자의 주소 의미

&ps->str2[1]: 배열 이름(str2)으로 시작하는 두 번쨰 문자의 주소 의미.

 

자기 참조형 구조체

 

struct _node n1,n2,n3;

n1.data=10;
n1.link=&n2;         //n1.link에는 n2의 주소 저장
n2.data=20;
n2.link=&n1;        //n2.link에는 n1의 주소 저장

n3.data=30;
n3.link=&n3;        //n3.link에는 자신의 주소 저장

printf("%x %x %x\n",&n1,&n2,&n3);     //각 구조체의 주소 출력 
printf("%x %x %x\n",n1.link,n2.link,n3.link);    //각 구조체link가 가르키는 주소 출력

printf("%d %d %d\n",n1.data,n2.data,n3.data);   //각 구조체 data가 가르키는 값 출력
printf("%d %d %d\n",n1.link->data,n2.link->data,n3.link->data);   //각 구조체 link가 가르키는 data값 출력
printf("%d %d %d\n",n1.link->link->data,n2.link->link->data,n3.link->link->data); //각 구조체 link가 가르키는 link의 data값 출력

출력결과

12ff5c 12ff4c 12ff3c

12ff4c 12ff5c 12ff3c

10 20 30

20 10 30

10 20 30

 

이러한 특성을 이용해 연결 리스트 만들 수 있다.

 

구조체의 크기를 예측하지 말자.

 

struct _data1 d1={'A',1};
struct _data2 d2={10,10};
struct _data3 d3={100,100};

printf("%d %d\n",sizeof(struct _data1),sizeof(d1));
printf("%d %d\n",sizeof(struct _data2),sizeof(d2));
printf("%d %d\n",sizeof(struct _data3),sizeof(d3));

모두 8byte 출력. d1의 실제 사용 메모리는 5, d2는 6, d3는 8이지만 사용되지 않는 부분이 만들어지며 주소로 매핑.

모두 8byte가 된다. 그러므로 구조체의 크기는 sizeof를 이용하여 구한다.

 

만약 구조체의 크기가 실제 멤버들의 크기와 같도록 주소를 매핑시키고자 한다면 전처리를 이용한 #pragma pack()옵션으로 설정

속도 저하의 우려있음.

 

출력결과

 

#pragma pack(1)

5 5

6 6

8 8

#pragma pack(2)

6 6

6 6

8 8

#pragma pack(3)

8 8

8 8

8 8

 

 

 

'-포인터' 카테고리의 다른 글

비트 연산자 정리  (0) 2008.07.30
입출력 함수 정리  (0) 2008.07.30
포인터와 구조체  (0) 2008.07.20
구조체와 공용체  (0) 2008.07.16
포인터와 문자열II  (0) 2008.07.16
포인터와 문자열  (0) 2008.07.11
Posted by hyunny82
이전버튼 1 2 3 4 이전버튼

티스토리 툴바