< 26강. 배열 가리키기 (배열 포인터) >
이번에 배우는게 진짜 배열 포인터!
*ptr = arr;은 아님!
#include <stdio.h>
int main() {
// arr[i] = *(arr+i) = *(ptr+i) = *(i+ptr) = i[ptr]
// a[b] -> *(a+b) 처리가 됨
int arr[3] = { 1,2,3 };
int *ptr = arr;
for (int i = 0 ; i<3 ; i++){
printf("%d ",*(arr+i));
}
printf("\n")
for (int i = 0; i <3 ; i++){
printf("%d ",i[ptr]);
}
printf("\n");
}
실무에서 i[ptr] 처럼 쓸 일은 없다! 쓰면 안되고!
#include <stdio.h>
int main() {
/*
1. arr == &ptr[0]
2. *ptr == ptr[0]
3. ptr + 1 == ptr에 sizeof(*ptr)을 더한 값 (int면 4 더해서 이동)
*/
int arr[3] = { 1,2,3 };
// 4가 더해짐
printf("arr = %d\n",arr);
printf("arr + 1 = %d\n",arr+1);
// 12가 더해짐 4x3(개수)
// &arr + 1 == &arr에 sizeof(arr)을 더한 값 (int면 4 더해서 이동)
// "*", "&" 만나서 사라짐
printf("&arr = %d\n",&arr);
printf("&arr + 1 = %d\n",&arr+1);
}
이제부터 배열 포인터가 나온다! 배열 자체를 선언하는 포인터
#include <stdio.h>
int main() {
int arr[3] = { 1,2,3 };
// 가리킬 배열의 길이를 []안에 입력
// 길이 3인 int형 배열을 가리키는 포인터를 선언
int (*ptr_arr)[3];
ptr_arr = &arr; // arr의 주소지인 arr[0]이 입력됨
for ( int i = 0 ; i<3; i++){
printf("%d\n",(*ptr_arr)[i]);
}
}
배열의 주솟값을 넣어주고 포인터가 arr을 가리키는 상황에서 가리키는 배열 *(ptr_arr)의 i번째 요소를 출력한 것이다.
< 27강. 2차원 배열과 배열 포인터 >
#include <stdio.h>
int main() {
int arr[2][3] = {{1,2,3},{4,5,6}};
printf("%d\n",sizeof(arr)); //24
printf("%d\n",sizeof(arr[0])); //12
printf("%d\n",sizeof(arr[0][0])); //4
// 앞에 &를 붙이면 값이 같음. 배열의 주소는 어차피 arr[0][0]이기 때문에!
}
/*
1. arr == &ptr[0]
2. *ptr == ptr[0]
3. ptr + 1 == ptr에 sizeof(*ptr)을 더한 값 (int면 4 더해서 이동)
*/
#include <stdio.h>
int main() {
int arr[2][3] = {{1,2,3},{4,5,6}};
int (*ptr)[3] = &arr[0]; // arr = &arr[0];
// 1. ptr[i] == arr[i] ??
// 2. ptr[i][j] == arr[i][j] ??
// 3. ptr == arr ??
// ptr은 행 전체를 가리키는 포인터이고,
// ptr에 1을 더할 때마다 그 다음 행을 가리킨다고 이해해도 된다.
for (int i = 0; i < 2;i++){
for (int j = 0;j < 3 ;j++){
printf("%d ",ptr[i][j]);
}
printf("\n");
// arr와 똑같이 출력됨
}
}
#include <stdio.h>
int main() {
int arr[2][3] = {{1,2,3},{4,5,6}};
for (int (*row)[3] = arr; row < arr + 2; row++){
// row가 arr[0]을 가리키고 있음
// row ++은 바로 다음 행을 가리키게 함
// for문 내에서 다음 행을 계속 가리키는 것
for (int *col = *row;col < *row +3 ; col++){
// col은 row가 가리키는 배열 자체를 의미한다.
// col은 row가 가리키는 배열의 첫 row[0]을 가리키는 것
// col++을 하게 되면 다음 열을 계속 가리키게 된다.
printf("%d ",*col);
}
printf("\n");
}
}
< 28강. 포인터 배열 >
포인터 배열 : 포인터들이 배열되어 있는 것 (포인터가 여러개)
배열 포인터 : 배열을 가리키는 포인터 (1개짜리)
#include <stdio.h>
int main() {
// 배열 포인터
int(*ptr)[4]; // 4개 짜리 int형 배열을 가리키는 포인터
// 포인터 배열
int *ptr[4]; // 괄호만 지우면 됨. 각 칸이 무언가를 가리키는 포인터임
}
#include <stdio.h>
int main() {
// 포인터 배열
int *ptr[4]; // 괄호만 지우면 됨. 각 칸이 무언가를 가리키는 포인터임
int a = 10;
int b = 20;
int c = 30;
int d = 40;
// 0번째 포인터에 a의 주소를 입력
ptr[0] = &a;
ptr[1] = &c;
ptr[2] = &d;
ptr[3] = &b;
printf("%d %d %d %d\n",*ptr[0],*ptr[1],*ptr[2],*ptr[3]);
}
ptr[0]은 그냥 주소를 가리키는 것이라, *ptr[0]을 해야 이 포인터가 가리키는 값을 출력할 수 있다.
#include <stdio.h>
int main() {
int arr[4] = { 1,2,3,4 };
// 포인터 배열
int *ptr[4]; // 괄호만 지우면 됨. 각 칸이 무언가를 가리키는 포인터임
for (int i=0;i<4;i++){
ptr[i] = &arr[i];
// 주솟값을 저장시킴
}
for (int i =0 ; i<4 ; i++){
printf("%d ",*ptr[i]);
}
printf("\n");
}
#include <stdio.h>
int main() {
char str[] = "Hello";
printf("%s\n", &str[0]);
// 0번쩨 칸을 가리키는 주소(포인터)를 알려주면 NUL포인트가 나올때까지 순서대로 출력해줌
// 그게 %s 이다.
// str = &str[0] 이랑 같은 것
}
#include <stdio.h>
int main() {
char strings[3][10] = {"Hello","World","Cha"};
for (int i = 0 ; i < 3 ; i++){
printf("%s\n",&strings[i][0]);
// i가 1일 경우 1행을 가리키는 것 [1][0]이어서
// 1행의 첫 열 주소를 알려준 것이기에 끝까지 출력된다.
// &string[i]로 해도 주소는 같기에 결과가 같다.
}
}
아래처럼 바꿀 수도 있다.
#include <stdio.h>
int main() {
char strings[3][10] = {"Hello","World","Cha"};
char *p_str[3]; // 3개짜리 포인터 배열
for ( int i = 0; i <3 ; i++){
p_str[i] = strings[i]; // == &strings[i][0]
// 각 포인터 배열들의 포인터들이 실제 배열의 첫 주소를 가리키고 있는 것
}
for (int i = 0 ; i < 3 ; i++){
printf("%s\n",p_str[i]);
// i가 1일 경우 1행을 가리키는 것 [1][0]이어서
// 1행의 첫 열 주소를 알려준 것이기에 끝까지 출력된다.
// string[i]로 해도 주소는 같기에 결과가 같다.
}
}
< 29강. (배열과 포인터) 종합문제 >
/* 1.
100개 이하의 정수를 입력받아
첫 줄에 짝수 번째 숫자들을 순서대로 출력하고,
다음 줄에 홀수 번째 숫자들을 순서대로 출력하는 프로그램을 만들어 보세요.
입력 예
7
3 1 4 1 5 9 2
출력 예
1 1 9
3 4 5 2
*/
#include <stdio.h>
int main() {
int n;
int arr[100];
scanf("%d",&n);
for (int i = 0; i < n ; i++){
scanf("%d",&arr[i]);
}
for (int i = 1; i < n; i+=2){
printf("%d ",arr[i]);
}
printf("\n");
for (int i = 0; i < n; i+=2){
printf("%d ",arr[i]);
}
}
2번 문제
코드만 보고 어떤 값이 나올지 맞춰보자!
포인터에 a의 값을 먼저 저장함
*ptr = 30; 은 a를 가리키고 있기에 값이 30을 바뀐다. (a=30과 같음) 아래도 마찬가지
3번 문제
arr + i는 처음에 12씩 더해질 것이다. (주솟값 더할 때) 그 다음 4씩 더해짐 (int 형)
/*
4.
10 * 10 이하의 정수형 이차원 배열을 입력받아
그 배열의 각 행의 요소의 합을 출력하는 프로그램을 만들어 보세요.
입력 예
3 4
4 2 6 3
7 9 3 4
5 1 2 1
출력 예
15
23
9
*/
#include <stdio.h>
int main(){
int r,c;
int arr[12][12];
scanf("%d %d",&r,&c);
for (int i=0 ; i < r ;i++){
for (int j=0 ; j < c ; j++){
scanf("%d",&arr[i][j]);
}
}
for (int i=0 ; i < r ;i++){
int sum = 0;
for (int j = 0 ; j < c ; j++){
sum += arr[i][j];
}
printf("%d\n",sum);
}
}
< 30강. (배열과 포인터) 종합문제 2>