'C'에 해당되는 글 116건

  1. 2007.11.03 문자열 상수 포인터 by 청웨일
  2. 2007.11.03 CPU가 하는 작업 by 청웨일
  3. 2007.11.03 레지스터의 종류와 역할 by 청웨일
  4. 2007.11.03 배열과 포인터 by 청웨일
  5. 2007.11.03 포인터 식 by 청웨일

문자열 상수 포인터

C : 2007. 11. 3. 11:48
 

C에서 문자열 상수는 큰 따옴표로 나타낸다.

컴파일러가 이런 문자열을 만나면, 프로그램의 문자열 테이블에 저장하고

그 문자열에 대한 포인터를 생성한다.


p.213

#include <stdio.h>
int main()
{
 char *p;
 p="One two three";
 printf(p);

 return 0;
}


p.214_1
#include <stdio.h>
#include <string.h>

int main()
{
 char *p="stop";
 char str[80];

 do {
  printf("Enter a string: ");
  gets(str);
 } while(strcmp(p, str));
 return 0;
}


p.215_1
#include <stdio.h>
int main()
{
 char *p1 = "One";
 char *p2 = "two";
 char *p3 = "three";

 printf("%s %s %s\n", p1, p2, p3);
 printf("%s %s %s\n", p1, p3, p2);
 printf("%s %s %s\n", p2, p1, p3);
 printf("%s %s %s\n", p2, p3, p1);
 printf("%s %s %s\n", p3, p1, p2);
 printf("%s %s %s\n", p3, p2, p1);

 return 0;
}

Posted by 청웨일

CPU가 하는 작업

C/common : 2007. 11. 3. 11:46
 

CPU가 실행할 수 있는 기계어 명령어를 기능을 기준으로 분류


*주요 기계어 명령어의 종류와 기능*

데이터 전송 명령어 - 레지스터와 메모리, 메모리와 메모리, 레지스터와 주변기기간의 데이터
                             전송을 담당

연산 명령어 - 어큐뮬레이터를 이용해서 숫자계산, 논리 연산, 크기 비교, 시프트 등을 수행

점프 명령어 - 조건분기, 반복, 무조건 점프 등을 수행

호출/리턴 명령어 - 함수를 호출/호출한 부분으로 되돌아가기

Posted by 청웨일
 

어큐뮬레이터 - 연산의 대상이 되는 데이터 저장                          

플래그 레지스터 - 연산 처리 후 CPU의 상태 저장              일반적으로 CPU에 하나씩

프로그램 카운터 - 다음에 실행할 명령어가 보관된 어드레스 저장    ┘ 나머지는 여럿씩
               CPU가 하나의 명령을 실행하면 프로그램 카운터값이 자동으로 하나씩 증가
               하나이상의 어드레스를 차지하는 명령어를 실행할 경우 명령어 크기만큼 증가
               프로그램의 흐름을 결정한다.

베이스 레지스터 - 데이터용 메모리 영역에서 첫번째 어드레스 저장

인덱스 레지스터 - 베이스 레지스터에서 상대 어드레스 저장

범용 레지스터 - 임의의 데이터 저장

명령어 레지스터 - 명령어 그 자체를 저장.
               CPU가 내부적으로 사용하는데, 프로그래머가 프로그램에 포함된 코드를 통해
               이 레지스터의 값을 읽고 쓰는 것은 불가능하다.


레지스터는 명령어 또는 데이터처럼 두 종류의 값을 보관하게 된다.

데이터에는 연산에 사용되는 것(오퍼랜드, operand)과
메모리 어드레스를 나타내는 것 두 종류가 있다.

operand - 피연산자, 연산의 대상이 되는 것.

CPU - 역할이 다양한 레지스터의 집합체

Posted by 청웨일

배열과 포인터

C : 2007. 11. 3. 11:39

C에서는 배열을 함수에 전달할수 없으며, 단지 배열에 대한 포인터만 전달할 수 있다.

포인터 = 배열의 0번째 주소.


#연산자 우선순위

()   >  ++   >   *   >   +


p.206
#include <stdio.h>
int main(void)
{
 int a[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
 int *p;

 p=a;

 printf("%d %d %d\n", *p, *(p+1), *(p+2));  //포인터p가 가리키는 값 증가.

 printf("%d %d %d\n", a[0], a[1], a[2]);

 return 0;
}


p.207
#include <stdio.h>
int main(void)
{
 char str[] = "Pointers are fun";
 char *p;   //포인트 변수선언
 int i;

 p = str;     //포인트변수p의 배열변수str에 주소치환

 for(i=0; p[i]; i++) printf("%c", p[i]);

 return 0;
}

*

#include <stdio.h>
int main(void)
{
 char str[] = "hello";   //char *p =  "hello";  

 char *p;                    //문자열의 포인터가 되는 0번째 배열의 주소만

 p = "hello";                //참조하기 때문에 가능한 문법.
 p = str;

 puts(p);
 return 0;
}


*배열명은 상수이므로 증감시킬수 없다.


p.209
#include <ctype.h>           //toupper(), tolower()함수 사용
#include <stdio.h>

int main(void)
{
 char str[80];
 int i;

 printf("Enter a string: ");
 gets(str);

 for(i=0; str[i]; i++) str[i] = toupper(str[i]);   //대문자로 바꾼다.

 printf("%s\n", str);

 for(i=0; str[i]; i++) str[i] = tolower(str[i]);   //소문자로 바꾼다.

 printf("%s\n", str);

 return 0;
}


p.210
#include <ctype.h>                 //toupper(), tolower()함수 사용
#include <stdio.h>

int main(void)
{
 char str[80], *p;

 printf("Enter a string: ");
 gets(str);


 p = str;

 while(*p) {          //포인터 p가 널값을 가리키게 되면 반복 중지
  *p++ = toupper(*p);
 // p++;            //포인터 p 증가
 }

 printf("%s\n", str);


 p = str;

 while(*p) {
  *p = tolower(*p);
  p++;
 }

 printf("%s\n", str);

 return 0;
}


  *p++ = toupper(*p);

-> ++가 p다음에 오기 때문에 p가 가리키는 값을 먼저 얻을 수 있고,

   그 다음 p가 다음 원소를 가리키기 위하여 증가된다.


p.211
#include <stdio.h>
#include <string.h>
int main(void)
{
 char str1[] = "Pointers are fun to use";
 char str2[80], *p1, *p2;

 p1 = str1 + strlen(str1) -1;
 p2 = str2;

 while(p1>=str1) *p2++ = *p1--;
 *p2 = '\0';

 printf("%s %s", str1, str2);

 return 0;
}


p.212_2
#include <stdio.h>

int main(void)
{
 int temp[5] = {10, 19, 23, 8, 9};
 int *p;

 p = temp;

 printf("%d ", *(p+3));

 return 0;
}


p212_3
#include <stdio.h>
int main(void)
{
 char str[80], *p;

 printf("enter string : \n");
 gets(str);

 p = str;

 while(*p && *p != ' ') p++;  //p가 공백을 가리키지 않으면 p를 증가시킨다.
 printf("%s", p);

 return 0;
}

Posted by 청웨일

포인터 식

C : 2007. 11. 3. 11:36
 

산술 연산자 ++, --...등

포인터에 증가 연산이 일어나면 포인터는 가리키고 있던 항목의 다음 항목을 가리키게 된다.


int *p;


p = p + 200;   //현재 p가 가리키는 정수로부터 200번째 있는 정수를 가리키게 된다.

 

포인터에 정수의 덧셈과 뺄셈 외에 다른 산술 연산은 적용할 수 없다.

증감 연산자를 이용하여 포인터 자체에 또는, 포인터가 가리키는 객체에 적용하는 것이 가능하다.

*p++     //포인터 p를 증가시킨다.

(*p)++   //포인터가 가리키는 주소의 값이 증가한다.


포인터에 저장된 메모리 주소를 출력하기 위해 printf()를 사용할수 있고,

형식 지정자 %p를 사용한다.


p.203
#include <stdio.h>
int main(void)
{
 char *cp, ch;     //문자형
 int *ip, i;           //정수형
 float *fp, f;       //실수형
 double *dp, d;   //두배실수 형

 cp = &ch;
 ip = &i;
 fp = &f;             //각 포인터와 변수 연결
 dp = &d;

 printf("%p %p %p %p\n", cp, ip, fp, dp);   //포인터의 메모리 주소 출력

 cp++;
 ip++;
 fp++;                 //포인터 주소 증가
 dp++;

 printf("%p %p %p %p\n", cp, ip, fp, dp);    //증가된 주소 출력

 return 0;
}

결과 :

사용자 삽입 이미지


p.204                                            p.205

#include <stdio.h>                         #include <stdio.h>

int main(void)                                int main(void)
{                                                  {
 int *p, q;                                        int *p, q;

 p = &q;                                          p = &q;
 q = 1;                                            q = 1;
 printf("%p\n", p);                          printf("%p\n", p);

 *p++;     //p증가                            (*p)++;      //q증가
 printf("%d\n%p", q, p);                  printf("%d\n%p", q, p);

 return 0;                                        return 0;
}                                                   }

결과 :

사용자 삽입 이미지

Posted by 청웨일