변수의 기본적인 선언
변수가 정수형일 때 int v = 42;
변수가 문자열일 때 (여러문자와 '\0') char str[] = "Hello!";
변수가 배열일 때 int arr[] = {1,2,3,4,5};
&(ampersand, 앰퍼센드) - 이 변수의 메모리 상의 주소가 뭐니?
* (asterist, 애스트러스크) - 그 주소가 가리키고 있는 값을 가져와라
변수 출력의 의미
int answer = 42;
printf("%d\n", answer); - answer변수를 "십진수\n" 형태로 출력하라 (%d의 d는 decimal)
printf ("%d\n", &answer); - answer변수가 저장되어있는 메모리 주소를 출력하라
#include <stdio.h>
int main(){
int n = 42;
int *p = &n;
printf("%d\n", &n);
printf("%d\n", p);
printf("%d\n", *p);
}
/*
출력값:
EW1231249aAS (n의 주소값 가정)
EW1231249aAS
42
*/
포인터 변수는 변수 앞에 *(애스터러스크)를 붙여서 만들 수 있음
* (애스터러스크) 로 만든 포인터 변수가 저장하고 있는 주소의 실제 값을 출력할 때 다시 *를 써서 출력해야함
중요 !!
포인터변수는 태어날 때 쓰인 별과 사용할 때 별을 다르게 해석해야함......
배열과 문자열은 &를 붙이지 않아도 알아서 주소값을 할당한다.
배열의 첫번째 요소와 포인터가 가리키는 값은 같다 = 포인터는 배열의 첫번째 요소를 가리키고 있다
#include <stdio.h>
int main() {
int array[] = {10,20,30,40,50};
int *p = array;
printf("배열의 첫번째 요소 :%d\n", array[0]);
printf("포인터가 가리키는 값: %d\n", *p);
if(*p == array[0]){
printf("배열의 첫번째요소와 포인터가 가리키는 값은 같다");
}else{
printf("배열의 첫번째요소와 포인터가 가리키는 값은 다르다");
}
}
포인터의 값이 1 증가하면 가리키는 요소가 다음으로 이동한다.
#include <stdio.h>
int main() {
char str[] = "Hello, World";
char *p = str;
while (*p != '\0') {
printf("%c", *p);
p++;
}
}
/*
출력 :
Hello, World
*/
포인터로 값을 변경하면 어떻게 될까
#include <stdio.h>
int main() {
int value = 1;
int *p = &value;
//pointer로 값을 변경할 때
*p = 3;
printf("%d\n", *p);
printf("%d", value);
}
/*
출력 :
3
3
*/
문자열과 문자, 정수 출력
문자열과 배열은 포인터에 주소값을 넣을 때 &를 붙이지 않는 것처럼 출력할 때도 *(애스터러스크)를 사용하지 않는다
#include <stdio.h>
void prints(char *str){
printf("입력 : %s\n", str);
}
void prints2(char *ch){
printf("입력 : %c\n", *ch);
}
void printd(int *value){
printf("입력 : %d\n", *value);
}
int main() {
int value = 1;
char ch = 'A';
char str[] = "this is String";
char str2[] = {'A', 'P', 'P', 'L', 'E', '\0'};
prints(str);
prints(str2);
prints2(&ch);
printd(&value);
return 0;
}
/*
입력 : this is String
입력 : APPLE
입력 : A
입력 : 1
*/
배열의 포인터가 가리키는 위치 이동 방법
#include <stdio.h>
double avgArray(int *arr, int size){
int sum = 0;
int sum2 = 0;
for (int i = 0; i < size; i++){
sum += arr[i];
}
for (int i = 0; i < size; i++){
sum2 += *arr;
arr++;
}
printf("배열의 평균값은 %.2f입니다.\n", (double)sum2/size);
return (double)sum/size;
}
int main() {
int myArray[] = {100, 22, 34, 55, 70};
int size = sizeof(myArray)/ sizeof(myArray[0]);
printf("배열의 평균값은 %.2f입니다.\n", avgArray(myArray,size));
return 0;
}
/*
배열의 평균값은 56.20입니다.
배열의 평균값은 56.20입니다.
*/
구조체와 포인터
#include <stdio.h>
#include <string.h>
struct Bag{
char brand[50];
int year;
float price;
};
void printBag(struct Bag *bag){
printf("Brand : %s\n", bag -> brand);
printf("year : %d\n", bag -> year);
printf("price : %.2f\n", bag -> price);
}
int main() {
struct Bag myBag;
struct Bag *bagPtr = &myBag;
strcpy(bagPtr -> brand,"Gucci"); //혹은
char name[] = "Chanel";
strcpy(bagPtr -> brand,"Gucci");
for (int i =0; name[i] != '\0'; i++ ) {
bagPtr->brand[i] = name[i];
}
bagPtr->year = 2021;
bagPtr->price = 45000.11;
printBag(bagPtr);
return 0;
}
/*
Brand : Chanel
year : 2021
price : 45000.11
*/
아스키 코드와 포인터
#include <stdio.h>
int main() {
char *p = "KOREA";
printf("%s\n", p);
printf("%s\n", p+1);
printf("%c\n", *p);
printf("%c\n", *(p+3));
printf("%c\n", *p+4);
printf("%d\n", *p+4);
return 0;
}
/*
KOREA
OREA
K
E
O
79
*p가 가리키는 문자는 'K'
아스키코드상 문자 'K' 에서 4번째 뒤에 있는 문자는
KLMN'O'
A = 65
A B C D E F G H I J K L M N O P
65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80
*/