< 23강. 문자열 >
문자열 : 문자들이 열거되어 있는 것
#include <stdio.h>
int main(){
char arr[] = "Hello, world!";
printf("%s\n",arr);
}
char을 사용해서 문자열 입력 가능
배열처럼 []안에 안적어도 됨
#include <stdio.h>
int main(){
char arr[] = "Hello, world!";
// 배열의 크기 14, 글자수는 13개
// 문자 뒤에 NUL 문자가 붙음('\0')
// 문자열의 끝이다라는 것을 나타내는 것
printf("%d\n", sizeof(arr) / sizeof(char));
}
#include <stdio.h>
int main(){
char s[100];
scanf("%s",s); //여기서는 &s로 사용하지 않음 이후 포인터에서 설명
printf("%s\n",s);
}
문자열에서는 & 사용하지 않음,
거의 string을 사용해서 char를 볼 일이 적긴함!
<stdio.h> 는 파일이다.(헤더 파일이라고 함 ) 내부에 있는 것을 사용하려면 include 시켜야함
#include <stdio.h>
#include <string.h>
int main(){
char str[] = "Hello";
int len;
// strlen : 길이를 알려주는 함수
len = strlen(str);
printf("%d\n",len);
}
이제부터는 #include <string.h>를 포함시켜야 한다.
- strlen : 길이 반환
#include <stdio.h>
#include <string.h>
int main(){
char str1[] = "Hello";
char str2[100];
// 문자열을 복사하는 것 (빈공간,원본문자열)
strcpy(str2,str1);
}
- strcpy : (a,b) b의 요소를 복사하여 a에 입력함
#include <stdio.h>
#include <string.h>
int main(){
char str[100] = "Hello ";
strcat(str,"World!");
printf("%s\n",str);
}
- strcat : (str,"") str에 " " 사이의 문자열을 덧붙일 수 있다.
#include <stdio.h>
#include <string.h>
int main(){
char str1[] = "sample";
char str2[] = "simple";
// str compare
int cmp = strcmp(str2,str1);
printf("%d\n",cmp);
}
- strcmp(a,b) : a가 b보다 순서적으로 앞에 있으면 -1(-8, 8바이트여서), a가 b보다 뒤에 있다면 1(8)을 반환, 같으면 0을 반환
< 24강. 변수 가리키기(포인터) >
포인터 (pointer) : 변수의 주소를 저장하는 변수
a에 20을 저장했을 때, ptr에 어떤 값을 넣어야 a를 지칭할 수 있는지를 알 수 있다. 그러기 위해서는 a의 주소를 먼저 알아야 한다.
칸들의 번호를 가지고 주소라고 부르는 것이다. ptr이 a를 가리키기 위해서는 a의 주소를 넣어주면 되는 것이다.
int main() {
int a = 20;
// pointer 하나를 선언한 것
// *을 붙여서 구별한다.
// 가리킬 변수의 자료형을 먼저 적어주고 *, 변수의 이름을 적어준다.
int *ptr_a;
// &a를 저장시킨다. 이제부터 &~가 나오면 주솟값을 말한다. &a면 a의 주솟값이 되는 것.
ptr_a = &a;
// 실행마다 다른 값이 나옴, RAM의 상황에 따라 바뀌기 때문에
printf("%d\n",ptr_a);
}
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int *ptr;
ptr = &a;
printf("ptr이 가리키는 변수에 저장된 값 : %d\n",*ptr);
ptr = &b;
printf("ptr이 가리키는 변수에 저장된 값 : %d\n",*ptr);
}
각자 a,b의 값을 출력한다.
#include <stdio.h>
int main() {
int a = 10;
int *ptr;
ptr = &a;
printf("a의 값 : %d\n", a);
// a에 20을 넣으라는 말과 같음
*ptr = 20;
printf("a의 값 : %d\n", a);
}
#include <stdio.h>
int main() {
int a = 10;
int *ptr;
ptr = &a;
// 포인터를 가리키는 포인터를 생성
int **ptr_ptr;
ptr_ptr = &ptr;
printf("a = %d\n",a);
printf("&a = %d\n",&a);
printf("ptr = %d\n",ptr);
printf("&ptr = %d\n",&ptr);
printf("ptr_ptr = %d\n",ptr_ptr);
// 아래 처럼하면 ptr이 가리키는 것을 부르고 그 저장된 값을 부른다.
printf("*ptr_ptr = %d\n",*ptr_ptr);
// *는 ptr **는 a를 말하는 것, 10출력
printf("**ptr_ptr = %d\n",**ptr_ptr);
}
포인터로 포인터를 가리켰어도 **을 붙이면 전전단계로 돌아가는 것 처럼 다시 a를 반환한다!
< 25강. 배열과 포인터의 관계 >
#include <stdio.h>
int main() {
int a = 10;
int *ptr_a = &a; // 포인터 자체에 a의 값을 저장하는 것 / 포인터가 가리키는 것에 저장하는 것 X
printf("ptr_a의 값 : %d\n",ptr_a);
// 4가 더해짐. int가 4바이트라서. 포인터가 가리키는 자료형의 크기 만큼을 더하게 됨
printf("ptr_a+1의 값 : %d\n",ptr_a+1);
}
#include <stdio.h>
int main() {
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("arr의 값 : %d\n",arr);
// arr의 값은 arr[0]의 주솟값과 똑같음
// 배열 하나를 선언했을 때, arr = &arr[0]이라는 것이다.
// arr + 1 = &arr[1]이 된다.
for (int i = 0; i< 10;i++){
printf("&arr[%d] = %d\n",i,&arr[i]);
// 주솟값이 4씩 차이나게 할당됨
}
}
#include <stdio.h>
int main() {
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < 10; i++){
printf("%d ",arr[i]);
}
printf("\n");
for (int i = 0; i < 10; i++){
printf("%d ",*(arr+i));
// arr+i = &arr[i] (arr[i]값에 있는 주솟값)
// arr+i에 *를 붙이면서 그 주솟값이 가지는 값을 반환한다.
}
printf("\n");
// 포인터를 선언 후 초깃값에 arr를 집어넣는다. &arr[0]의 주소를 넣는 것
// 이 주소에 저장되있는 값을 출력하라는 것. 즉 arr[0]을 출력
// ptr++은 arr[0], arr[1]... 로 증가시켜주는 것 1씩 증가는 int라 4바이트씩 이동이어서
// 10이 arr + 9여서 arr+10이 되기 전에 for문 탈출!
// 다 같은 for문이다. ptr = arr + i로 생각하면 비슷하다.
for (int *ptr = arr; ptr < arr+10; ptr++){
printf("%d ",*ptr);
}
printf("\n");
}