- 포인터 : 어느 대상을 가리키기 위한 주소를 저장하는 데이터 타입
- 포인터가 가리키는 대상은 포인터에 *연산을 통하여 접근
#include <stdio.h>
int main(void)
{
int a = 10;
int *p = &a; //int 자료형을 가리키는 포인터 = a의 주소
printf("0x%p\n",&a); //a의 주소
printf("0x%p\n",p); //포인터가 가리키는 주소
printf("%d\n",a); //a의 값
printf("%d\n",*p); //포인터가 가리키는 대상의 값
printf("%d\n", sizeof(p)); //포인터의 사이즈
printf("%d\n", sizeof(*p));//포인터가 가리키는 대상의 사이즈
}
- 포인터는 가리키는 대상 타입에 맞게 선언되어야 한다.
#include <stdio.h>
int main (void)
{
char a = 'A';
char *p = &a;
double f = 3.14;
double *q = &f;
printf("%d\n", sizeof(*p)); //포인터가 가리키는 대상의 사이즈
printf("%c\n", *p); //포인터가 가리키는 대상의 값
printf("0x%p", p); //포인터가 가리키는 주소
printf("0x%p", p + 1); //포인터가 가리키는 주소 + 1 : char크기(1바이트)만큼 주소 이동
printf("0x%p", q); //포인터가 가리키는 주소
printf("0x%p", q + 1); //포인터가 가리키는 주소 + 8 : double크기(8바이트)만큼 주소 이동
}
- 함수에서 전달받은 변수 내용을 변경하려면 포인터로 변수의 주소를 받아야 한다.
#include <stdio.h>
//Call By Value
void f1 (int b)
{
b = 100;
printf("%d\n",b);
}
//Call By Address
void f2 (int *p) //a를 가리키기 위한 포인터를 인자로 선언
{
*p = 100; //포인터가 가리키는 대상의 값을 100으로 변경
printf("%d\n",*p); //포인터가 가리키는 대상의 값을 출력
}
int main (void)
{
int a = 10;
f1(a); //Call By Value
printf("%d\n",a);
f2(&a);//Call By Address - a의 주소를 넘김
printf("%d\n",a);
}
#include <stdio.h>
int main (void)
{
char a[] = "Hello"; //배열은 포인터임
char *p = "Hello"; //인쇄할 문자열의 첫번째 주소 대입
//%s는 인쇄할 문자열의 첫 글자의 주소를 받음
printf("%s\n", "Hello");
printf("%s\n", &a[0]); //문자열의 첫번째 인자의 주소
printf("%s\n", a); //문자열
printf("%s\n", p); //문자열의 주소
printf("%s\n", "Hello"+1); //문자열의 주소를 이동시킴 -> ello 출력
printf("%s\n", a + 1); //문자열 주소 이동 -> ello 출력
printf("%s\n", p + 1); //포인터가 가리키는 주소 이동 -> ello 출력
}
#include <stdio.h>
char *func(char *q) // 반환형 : char * , 인자 : char *
{
printf("%s\n", q);
printf("%c\n", q[0]);
printf("%c\n", q[1]);
printf("0x%p\n", q);
printf("0x%p\n", q+1);
printf("0x%p\n", *q);
printf("0x%p\n", *(q+1));
return q + 2;
}
void main(void)
{
char *p = "Hello"; //문자열은 char 배열이다.
printf("%s\n", "Hello"); //Hello 출력
printf("0x%p\n", "Hello");//Hello의 시작 주소 출력
printf("0x%p\n", "Hello" + 1);//Hello 주소 + 1Byte 주소 출력
printf("%c\n", "Hello"[0]); //Hello의 문자열의 첫번째 글자 H 출력
printf("%c\n", "hello"[1]); //hello의 문자열의 두번째 글자 e 출력
printf("%c\n", *"Hello"); //문자열은 포인터이므로 문자열의 첫번째 대상 H를 출력
printf("%c\n", *("Hello" + 1));//문자열은 포인터이므로 포인터를 1Byte만큼 이동시킨 후 첫번째 인자 e출력
printf("%s\n", func("Hello")); //문자열을 반환받는 func함수에 포인터(주소) 전달 후 llo 반환받음
}
- *p++, *++p 의 동작
- ++, — 연산자가 주소에 사용되면 주소가 가리키는 크기만큼 증가, 감소한다.
- *++p : 먼저 포인터 p를 증가시키고 그 주소의 내용을 꺼내온다.
- *p++ : p주소에서 먼저 내용을 꺼내고 포인터 p를 증가시킨다.
#include <stdio.h>
void main(void)
{
int cnt = 0;
char *p = "Embedded"; //문자열의 첫번째 글자를 가리키는 포인터
while (*p) //*p가 \0(null 포인터)이 될 때 까지
{
if (*p++ == 'd') cnt++; //문자열을 가리키는 포인터의 주소를 한칸씩 이동시키며 d가 있으면 1씩 증가
}
printf("%d\n", cnt);
}
#include <stdio.h>
void main(void)
{
int cnt = 0, i = 0;
char *p = "Embedded";
while (p[i]) //E로 시작하는 포인터가 0(NULL Pointer)을 만날때 까지 반복
{
if (p[i++] == 'd') cnt++; //포인터를 한칸씩 이동시키며 cnt 증가
}
printf("%d\n", cnt);
}
#include <stdio.h>
void str_copy1(char * d, char * s) //주소를 받을 수 있도록 함수인자로 포인터 선언
{
int i;
for (i = 0; ; i++)
{
d[i] = s[i];
if (d[i] == '\0') return; // \0(NULL PTR)을 만나면 탈출
}
}
void str_copy2(char * d, char * s)
{
while (*d++ = *s++); // 0이되면 탈출
}
void main(void)
{
char a[5], b[5]; //문자열 배열 선언
char c[5] = "ABCD"; //문자열 배열에 ABCD\0 대입
str_copy1(a, c); //문자열 배열의 첫번째 인자의 주소 전달
str_copy2(b, c);
printf("%s %s %s\n", a, b, c);
}
#include <stdio.h>
unsigned int str_length(char * d)
{
// 코드 작성
int cnt = 0;
for (int i = 0; ;i++)
{
if(d[i] == 0) //널문자 검사 우선 수행
{
return cnt;
}
else
{
cnt++;
}
}
}
void main(void)
{
char a[] = "Willtek";
printf("%d\n", sizeof(a)); // \0 을 포함하여 출력
printf("%d\n", str_length(a)); // \0을 제외하여 출력
}
#include <stdio.h>
void str_add(char * d, char * s) //전달받은 a와 b를 합친다.
{
for(int i = 0; ; i++)
{
if(d[i] == 0) // "Willtek\0"에서 \0을 만나면 해당 자리부터 " Corp."을 이어씀
{
for (int j = 0; ; j++)
{
if(s[j] == 0)
{
return;
}
else
{
d[i+j] = s[j];
}
}
}
}
}
void main(void)
{
char a[15] = "Willtek";
char b[15] = " Corp.";
str_add(a, b); //a와 b의 첫번째 주소를 전달
printf("%s\n", a);
}
- 문자열 비교 함수
- 두개의 문자열의 크기를 비교하는 함수를 설계
- 두 문자열 a,b중에서 a가 크면 1, b가 크면 -1, 같으면 0 리턴
#include <stdio.h>
int str_comp(char *a, char *b)
{
// 코드 작성
int result = 0;
for (int i = 0;; i++)
{
if (a[i] > b[i]) // a가 크면
return result = 1;
else if (a[i] < b[i]) // b가 크면
return result = -1;
else if ((a[i] == b[i])&&(a[i]==0)) //널문자가 나타날 때까지 함수를 탈출 못하면 문자열이 모두 같다
return result = 0;
}
}
void main(void)
{
printf("%d\n", str_comp("ABC", "BC"));
printf("%d\n", str_comp("ABC", "AC"));
printf("%d\n", str_comp("ABC", "AB"));
printf("%d\n", str_comp("abc", "ABC"));
printf("%d\n", str_comp("ab", " "));
printf("%d\n", str_comp("A", "AB"));
}