Automotive/C

[C/C++] 문자열 포인터

코딩쪼앙 2024. 7. 26. 17:18

문자열

C에는 문자열이 없고, string 자료형이 내부적으로 구현되어있는데 이는 char의 배열로 이루어져있다.

string은 아래와 같이 사용하고, 저장된다.

string s = "Hello"
H e l l o \0
  • 이 코드에서 s는 "Hello"가 시작하는 첫 글자인 H가 위치한 메모리주소를 주소값으로 갖는다.
  • s는 첫 글자가 저장된 메모리 주소를 가지고 있고, 널이 나올 때 까지 루프를 돈다
  • 문자열은 포인터변수라고 보면 된다. 
typedef char *string;
  • String은 내부적으로 char의 포인터 변수로 정의 되어있으며, 라이브러리를 사용하지 않는다면 아래와 같이 사용할 수 있다.
char *s = "hello";
char[6] s = {'h','e','l','l','o','\0'};

 

문자열 포인터

# include <stdio.h>

int main() {
    char *a = "hello";
    printf("%s\n", a);
    printf("%p\n",a); // 포인터 a가 가진 값 ->"hello"의 h가 저장된 주소
    printf("%p\n",&(*a)); // a가 가지고있는 값(h)의 주소 -> "hello"의 h가 저장된 주소
    printf("%p\n", &a); // 포인터 변수 a의 주소

    printf("================================\n");
    int b = 10;
    int *p = &b;
    printf("%p\n",p); // 포인터 p가 가진 값 -> b의 주소
    printf("%p\n",&b); // b의 주소
    printf("%p\n",&p); // 포인터 변수 p의 주소

}

문자열 swap

  • 문자열 Hello와 Hyeji를 가리키는 포인터변수 a와 b 생성
  • swap함수 사용을 위해 각 문자열의 시작주소가 저장되어있는 a와 b의 주소값을 넘긴다.
  • 매개변수로 각 문자열이 저장된 포인터의 주소를 전달했으므로 인자 값을 받을 때 이중포인터로 받아야한다.
# include <stdio.h>

void swap(char **a, char **b) {
    char *tmp = *a; // 이중포인터 a가 가지고있는 값 (hello의 시작 h 주소)를 tmp에 넣기
    *a = *b;		// a값을 hyeji 시작주소로 변경
    *b = tmp;		// b의 값 (hyeji의 시작주소)에 tmp값 (hello의 시작주소 h) 넣기
}

int main() {
    char *a = "Hello";
    char *b = "Hyeji";
    swap(&a, &b);

    printf("%s %s",a,b);
}

 

'Automotive > C' 카테고리의 다른 글

[C/C++] 포인터 배열 및 복잡한 함수 포인터  (7) 2024.09.10
[C/C++] Pointer 및 Const  (1) 2024.07.24