포인터란? 생각보다 이건 단순함.
*
asterisk 란, 2가지의 큰 의미를 가짐.
1. 포인터를 선언할 때 사용.
2. 해당 주소에 값이 접근하는 용도로 쓰임.
1번
#include<stdio.h>
int main(){
int *p1; //pointer initialize.
int a =10; // a initialize.
p1=&a; // a adress join to p1
printf("a의 주소 =%u\n", &a);
printf("p1의 주소 = %u p1의 내용, a의 주소 =%u\n",&p1, p1 );
printf("%u %u %u\n\n", &(*p1), &(*(p1+1)), &(*(p1+2)));
printf("간접 참조 *p1을 지정하면 %d이 표시된다.\n", *p1);
}
return 0; // int 형으로 작성시 return 값 설정
#include<stdio.h>
int main(){
char *p1;
p1 ="PAK";
printf("p1의 주소 =%u %d p1의 내용 %u\n", &p1,&p1, p1);
printf("%u %u %u\n", &(*(p1)), &(*(p1+1)), &(*(p1+2)));
printf("%c %c %c\n", *p1, *(p1+1), *(p1+2));
printf("%c %c %c\n", p1[0], p1[1],p1[2]);
return 0;
}
#include<stdio.h>
int main(){
char *d ="12345";
printf("%c,,%s\n", *d, d);
d = d+1;
printf("%c,, %s\n", *d,d);
printf("%c,, %c\n", *(d-1), *(d+1));
return 0;
}
#include<stdio.h>
int main(){
int a[]={1,2,3,4};
int *p;
int i,sum =0;
p=a;
// 이렇게 처리하면 사실상 int *p=a 이렇게 초기화 하는 거 아닌가?
for(i=0;i<4;i++, p++){
sum+= *p;
printf("a[%d]의 주소 = %x\n", i ,p);
}
printf("\n배열의 원소의 합 =%d\n",sum);
}
#include<stdio.h>
void swap(int *num1,int *num2){
int temp;
//swap
temp= *num1;
*num1= *num2;
*num2= temp;
}
int main(){
//a 와 b의 위치 스왑
int a =5;
int b=10;
printf("a=%d\nb=%d",a,b);
swap(&a,&b);
printf("\n\nafter swap\n\n");
printf("a=%d\nb=%d",a,b);
return 0;
}
#include<stdio.h>
int main(){
char arr[6]={"hello"};
char* ptr;
// arr 자체는 값을 가지고 있는 중임.
// arr[n]; <--- n번째 값을 가지고 있는 것임.
ptr= &arr[0];
// printf("%c", ptr[1]) 이런식으로 배열의 인덱스로 접근을 해주어도 지목을 한 arr처럼 접근함
// 아래처럼 *로 접근 할 수도 있음.
printf("%c", *(ptr+4));
// *로 접근할 경우 *(ptr+1)로 접근해주면 됌.
// ptr +1로 작성하게 된다면, *는 맨 앞의 배열을 읽음.
// 근데 +1을 해주면 2번째가 나올 것 같지만 연산자의 우선순위 때문에, *먼저 연산함,
// 한마디로 위에 주석처리 한 것처럼 하게된다면 *ptr 의 주소를 뽑아내고 이 주소에 +1 한 것을 보여준다고 보면됌.
// pointer는 arr와 같이 사용해주면 좋음
return 0;
}
#include<stdio.h>
int main(){
int *p1, a[2];
float *p2, b[2];
p1=a;
p2=b;
printf("p1의 주소 : %u\np2 주소 :%u\n", &p1, &p2); //주소값 printf 3개 출력.
printf("p1의 값:%u\np2의 값:%u\n",p1,p2);
printf("a 주소:%u\nb 주소:%u\n", &a,&b);
*p1=1; // p1 이 가리키는 주소의 내용을 저장하고,a[0]에는 1저장/
*(p1+1)=2; // p1+1 즉, a[1]에는 2를 저장.
*p2 = (float)1.5; // p2이 가리키는 주소. b[0]에 1.5 저장
*(p2+1)=(float)2.5; // p2+1 즉, b[1]에 2.5 저장.
printf("%6d%6d%6.1f%6.1f\n", *p1, *(p1+1),*p2,*(p2+1)); //포인터 p1 출력 -> 1,
printf("%6d%6d%6.1f%6.1f\n",a[0],a[1],b[0],b[1]);
printf("%6d%6d%6.1f%6.1f\n",p1[0],p1[1],p2[0],p2[1]);
return 0;
}
#include<stdio.h>
int main(){
int *p1, a[2];
float *p2, b[2];
p1=a;
p2=b;
printf("p1의 주소 : %u\np2 주소 :%u\n", &p1, &p2); //주소값 printf 3개 출력.
printf("p1의 값:%u\np2의 값:%u\n",p1,p2);
printf("a 주소:%u\nb 주소:%u\n", &a,&b);
*p1=1; // p1 이 가리키는 주소의 내용을 저장하고,a[0]에는 1저장/
*(p1+1)=2; // p1+1 즉, a[1]에는 2를 저장.
*p2 = (float)1.5; // p2이 가리키는 주소. b[0]에 1.5 저장
*(p2+1)=(float)2.5; // p2+1 즉, b[1]에 2.5 저장.
printf("%6d%6d%6.1f%6.1f\n", *p1, *(p1+1),*p2,*(p2+1));
//포인터 p1 a[0]값 출력 -> 1, 포인터 p1의 a[1],
// 포인터가 가리키는 배열 b[0]을 값을 출력, 포인터 p2가 가리키는 b[1]의 값을 가짐.
printf("%6d%6d%6.1f%6.1f\n",a[0],a[1],b[0],b[1]);
// a[0~1],b[0~1] 의 값을 출력.
printf("%6d%6d%6.1f%6.1f\n",p1[0],p1[1],p2[0],p2[1]);
// p1[0~1], p2[0~1] 의 값을 출력.
// p1의 배열을 출력하는데. 왜 위에 a와 b의 배열이랑 같냐? 이건 단순함.
// pointer (*)란. 2가지의 큰 의미를 가짐. 1. 포인터를 선언할 때 사용. 2. 해당 주소에 값이 접근하는 용도로 쓰임.
return 0;
}