728x90
반응형
1. 포인터
(= 포인터 변수)
char ch='A';
char * ptr =&ch;
- 변수의 주소값을 담아두는 변수
- 주소값(&) 저장이 목적
ㄴ 주소는 모두 정수(음수 x), 각 byte의 첫 번째 주소값만 저장됨
(*ptr)++; //가리키는 대상의 값 증가
ptr++; //주소값을 증가시킴, 다른곳을 가리키게 되므로 함부로 하지 않기 //1증가
int num = 10;
int * ptr1 = #
ptr++; //4증가 (type의 byte만큼 증가함)
double num1 = 3.14;
double * ptr2 = &num1;
ptr1++; //8증가
int num;
printf("%u(unsigned)", &num); // 주소값 출력함
1-1) 포인터 변수(*)와 & 연산자
int num;
int *ptr = #
>> ptr은 변수명
int *ptr;
ptr = #
int *ptr1 = ptr; // 둘 다 &num을 가리킴
ptr = &num1; // num의 주소값은 휘발되고 num1 남음
// int * 자료형의 ptr 변수에 num의 주소값을 저장함
// 걍 ptr 찍으면 주소값 나옴
int num = 10;
int * ptr = #
int v =(*ptr)++; //*ptr을 v에 넣고 10, num은 11 //ptr이 가리키는 값 v에 대입 후에 ptr이 가리키는 값 증가
int v =*ptr++; //v=10, ptr을 4만큼 증가 //ptr이 가리키는 값을 v에 대입, ptr자체를 증가
int v =*++ptr; //ptr을 다른곳에 4증가, ptr이 가리키는 값 v에 대입
int v = ++*ptr; //v=11,num=11,ptr은 그대로 //ptr이 가리키는 값을 증가시킨 후에 v에 대입
1-2) 포인터 변수를 이용해 값을 통제
int num = 10;
int *ptr = #
*ptr++;
(*ptr)++; // num의 값이 11이 됨
int result = (*ptr)++; 주소값에서 값을 가져온 후 후위 연산
int result = *ptr++; 4byte보다 큰 다른 공간을 가리키게 됨
※ 주의할 점
- 초기화가 안된 포인터를 사용하면 안됨
int *ptr = NULL; 로 초기화할 것
ㄴ 아무곳도 가리키지 않는 포인터
- 포인터 타입 = 변수의 타입
2. 인수 전달 방법
1) call by value (값에 의한 호출)
- 외부에서 값 변경할 수 X
2) ★★★★★ call by reference (참조에 의한 호출)
- 외부에서 값 변경하는 게 가능
포인터 사용
ex.
void swap(int * a, int * b);
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 10, b = 20;
swap(&a, &b); // void형, tmp.
printf("%d %d", a, b);
return 0;
}
3. 포인터 연산
char *p = &ch; >> ++ 연산 시 주소값 1증가, ch 주소의 다음 주소를 가리킴
short 2byte >> 주소값 2만큼 증가
+++++++배열과 포인터+++++++
*배열과 포인터
int A[5] = {1, 2, 3, 4, 5};
int * ptr = A; // &A[0]; <-이거랑 A와 같음
char B[3] = {'A', 'B', '\0'};
char * cptr= 8mmmm=B;
포인터는 배열처럼 사용이 가능하다
배열 이름이 바로 포인터이다.
int * ptr = a;
배열 A[0] A[1] A[2] A[3]
포인터 ptr[0] ptr[1] ptr[2] ptr[3] <-이런식으로 접근 가능
(*ptr) (*ptr+1) (*ptr+2) (*ptr+3) =4바이트씩 증가
1 2 3 4
&A[0] == A;주소값 가져오기
&A[1] == A+1;
*배열과 함수
void sum(int *p, int size()) //int * p = A;
{
int sum = 0;
for(int i =0; i<size;i++)
//sum+=arr[i];
sum +=*(p+i);
printf("배열 요소의 합은 %d", sum);
}
int main(void)
{
int A[5] = {1, 2, 3, 4, 5};
sum(4,5)
return 0;
}
void sub(int * b, int n)
{
b[0] = 4;
b[1] = 5;
b[2] = 6;
}
//A배열과 B배열을 더한 C배열을 출력하기
#include <stdio.h>
void array_add(int* A, int* B, int* C, int size);
int main(void)
{
int A[10] = { 200,100,150,200,100,150,160,170,180,200 };
int B[10] = { 50, 20, 30, 0, 10, 30, 50, 10, 20, 10 };
int C[10] = { 0 };
array_add(A, B, C, 10);
printf("C[]배열 : "); //출력
for (int i = 0; i < 10;i++)
{
printf("%d ", C[i]);
}
return 0;
}
void array_add(int* A, int* B, int* C, int size)
{
for (int i = 0; i < size; i++)
{
C[i] = A[i] + B[i]; //*(C+i) = *(A+i) + *(B+i);
}
}
//포인터를 사용하여 주소값 출력하기
#include <stdio.h>
int main(void)
{
int i = 10;
char c = 69;
float f = 12.3;
printf("i의 주소 : %u\n", &i);
printf("c의 주소 : %u\n", &c);
printf("f의 주소 : %u\n", &f);
return 0;
}
//포인터를 사용하여 해당값 가져오기
#include <stdio.h>
int main(void)
{
int i = 10;
int* p;
p = &i;
printf("%d", *p);
return 0;
}
//포인터 사용하기
#include <stdio.h>
int main(void)
{
int x = 10, y = 20;
int* p;
p = &x;
printf("p=%d\n", p);
printf("x=%d\n", &x);
printf("*p=%d\n", *p);
printf("*p=%d\n", &p);
printf("*p=%u\n", &p);
p = &y;
printf("\np=%d\n", p);
printf("*p=%d\n", *p);
int a = 1023;
printf("\n%u", a);
return 0;
}
//포인터를 이용하여 두 값 바꾸기
#include <stdio.h>
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 10, b = 20;
printf("%d %d\n", a, b);
swap(&a, &b); // void형, tmp.
printf("%d %d", a, b);
return 0;
}
//포인터를 사용하여 두수의 합과 차 구하기
#include <stdio.h>
void get_sum_diff(int x, int y, int* p_sum, int* p_diff);
int main(void)
{
int num1, num2;
int sum = 0, diff = 0;
printf("두 개의 정수를 입력하세요");
scanf("%d %d", &num1, &num2);
get_sum_diff(num1, num2, &sum, &diff);
printf("두 수의 합은 %d ", sum);
printf("두 수의 차는 %d ", diff);
return 0;
}
void get_sum_diff(int x, int y, int* p_sum, int* p_diff)
{
*p_sum = x + y;
*p_diff = x - y;
}
//포인터 사용하기
#include <stdio.h>
int main(void)
{
int i = 10;
int* pi = &i;
printf("i = %d, pi = %u\n", i, pi);
(*pi)++;
printf("i = %d, pi = %u\n", i, pi);
printf("i = %d, pi = %u\n", i, pi);
*pi++;
printf("i = %d, pi = %u\n", i, pi);
return 0;
}
//포인터 이용하여 주소값 출력하기
#include <stdio.h>
int main(void)
{
int a[] = { 10,20,30,50,60 };
printf("&a[0] = %u\n", &a[0]);
printf("&a[1] = %u\n", &a[1]);
printf("&a[2] = %u\n", &a[2]);
printf("a = %u", a);
return 0;
}
//포인터 다양하게 출력하기
#include <stdio.h>
int main(void)
{
int a[] = {10,20,30,40,50};
printf("a = %u\n", a);
printf("a + 1 = %u\n", a+1);
printf("*a = %d\n", *a);
printf("*(a+1) = %d", *(a + 1));
return 0;
}
//포인터의 다양한 방법
#include <stdio.h>
void sub(int b[], int n);
int main(void)
{
int a[3] = { 1,2,3 };
printf("%d %d %d\n", a[0], a[1], a[2]);
sub(a, 3);
printf("%d %d %d\n", a[0], a[1], a[2]);
return 0;
}
//아래 3개는 다 같음. 배열=포인터
void sub(int b[], int n)
{
b[0] = 4;
b[1] = 5;
b[2] = 6;
}
void sub(int* b, int n)
{
*(b) = 4;
*(b + 1) = 5;
*(b + 2) = 6;
}
void sub(int* b, int n)
{
*(b) = 4;
*(b + 1) = 5;
*(b + 2) = 6;
}
//포인터 사용해서 C배열에 A,B배열 더한 값 넣기
#include <stdio.h>
void array_add(int* A, int* B, int* C, int size);
int main(void)
{
int A[10] = { 200, 100, 150, 200, 100, 150, 160, 170, 180, 200 };
int B[10] = { 50, 20, 30, 0, 10, 30, 50, 10, 20, 10 };
int C[10] = { 0 };
array_add(A, B, C, 10);
printf("C[]배열 : ");
for (int i = 0; i < 10; i++)
{
printf("%d ", C[i]);
}
return 0;
}
void array_add(int* A, int* B, int* C, int size)
{
for (int i = 0; i < size; i++)
{
C[i] = A[i] + B[i];
}
}
//100점 만점으로 점수 변환하기
#include <stdio.h>
void convert(double* grades, double* scores, int size);
int main(void)
{
double grades[10] = { 3, 4.1, 4, 2, 2.6, 3.2, 3, 2.5, 3.3, 4.3 };
double scores[10] = { 0 };
convert(grades, scores, 10);
printf("100점 만점 변환 점수\n");
for (int i = 0; i < 10; i++)
{
printf("%.2f ", scores[i]);
}
return 0;
}
void convert(double* grades, double* scores, int size)
{
for (int i = 0; i < size; i++)
{
scores[i] = grades[i] / 4.3 * 100;
}
}
//포인터 사용해서 배열에 난수넣기
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void array_fill(int* A, int size);
int main(void)
{
int A[6] = { 0 };
array_fill(A, 6);
for (int i = 0; i < 6; i++)
{
printf("%d ", A[i]);
}
return 0;
}
void array_fill(int* A, int size)
{
srand((unsigned)time(NULL));
for (int i = 0; i < size; i++)
{
A[i] = rand() % 100;
}
}
//포인터 이용해서 배열에 난수 넣기
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void array_print(int* A, int size);
int main(void)
{
int A[6] = { 0 };
array_print(A, 6);
printf("A[] = {");
for (int i = 0; i < 6; i++)
{
printf(" %d ", A[i]);
}
printf("}");
return 0;
}
void array_print(int* A, int size)
{
srand((unsigned)time(NULL));
for (int i = 0; i < size; i++)
{
A[i] = rand() % 100;
}
}
//입력받은 값을 1 증가시키는 함수, 부호를 바꾸는 함수 만들기
#include <stdio.h>
void changesign(int* n);
void increment(int* n);
int main(void)
{
printf("정수를 입력하세요 ");
int n;
scanf("%d", &n);
increment(&n);
printf("increment() 호출 후 %d \n", n);
changesign(&n);
printf("changesign() 호출 후 %d", n);
return 0;
}
void increment(int* n)
{
(*n)++;
}
void changesign(int* n)
{
*n*=-1;
}
728x90
반응형