배열과 문자열

2025. 5. 1. 20:49프로그래밍1및실습

1차원 배열

  • Index 혹은 첨자가 추가된 변수
  • int grade [4]와 같이 표현 가능하다.

배열의 선언

  • 저장 공간에 연속적으로 할당.
  • 배열명이 전체의 이름이다.
int array[5];

1차원 배열 초기화

  • automatic, external, static은 가능!
  • register는 불가능!
  • 중괄호를 활용하여서 초기화 가능.
  • 반드시 선언과 동시에 초기화 해주고, 선언 이후에는 하나씩 대입해야 한다.
int array[4]={0};
int array2[5]={1,2,3,4,5};
  • 요소의 수보다 초기값이 작으면 나머지는 0으로 초기화된다.
int ary2[5]={1,2,3};

  • external 또는 static은 초기화를 하지 않더라도 0으로 초기화됨.

배열의 첨자 연산

  • array [i]에서 i가 0~(배열의 길이)-1을 넘어간다면 런타임 에러가 뜸.
int array[4]={1,2,3,4};
int a[4]; //런타임 에러

 

  • 함수 호출 시의 ( )와 [ ] 연산자는 둘 다 가장 높은 우선순위이기 때문에 상황에 따라 대처해야 한다. 

sizeof 연산자의 활용

  • 배열은 보통은 많은 양의 데이터를 처리
  • 배열 요소 수를 직접 계산하여 반복문에 사용하면 편리함
  • (배열의 요소 수) = sizeof(배열명)/sizeof(배열 요소)
#include<stdio.h>

int main(){
      int a[5]={1,2,3,4};
      
      int cnt=sizeof(a);
      printf("%d\n", cnt);
      cnt/=sizeof(a[0]);
      printf("%d", cnt);
}
20 //20바이트 차지
5 //5개의 요소 존재
  • 전체 크기를 바이트 단위로 계산해주고 배열요소의 하나의 크기로 나누어주면 배열의 요소수를 구할 수 있다.

다차원 배열

  • 2차원 배열
int a [14][14]: 14*14 만큼의 공간을 할당
  • k-차원 배열
s1*s2*s3*s4...*sk개의 요소에 대한 공간을 할당

배열의 기본 주소에서 시작하여서 모든 요소들이 메모리에 연속적으로 저장됨

2차원 배열

int a [3][5];

-배열의 이름 a는 배열의 기본 주소는 &a [0][0]이다.
-배열은 기본 주소에서 시작하여서 compiler는 15개의 integer 공간을 할당함
#include <stdio.h>

int main() {
    int a[5][4] = {{0,}};

    printf("%p\n", &a[0][0]);

    printf("%p\n", a);

    return 0;
}​
0x7ffd9f1f6f20
0x7ffd9f1f6f20

 


-&a [0][0]과 a의 주소가 동일함을 볼 수 있음.

2차원 배열 초기화

  • 초기화 전에는 쓰레기 값 존재.
  • 이를 해결하기 위해 중괄호를 활용하여 초기화해 줌. 
  • 행의 수는 생략 가능하다.
int a[][4]={{1},{4,5}, {9,10,11}};
//초기화
1 0 0 0
4 5 0 0
9 10 11 0
  • 1차원 배열의 형식으로 초기화
int a[3][4]={1,2,3,4,5,6};
//초기화
1 2 3 4
5 6 0 0
0 0 0 0
  • 전체를 0으로 초기화하고 싶으면 {0}으로 중괄호를 생성해 주면 된다.

pointers

-메모리에 접근하고, 주소 조작을 위해 사용
-만약 v변수 하면 &v가 가지고 있는 정보는 주소가 됨.

int *p;
p=0;
p=NULL; //0과 동일
p=&i; //int i; // i의 주소
p=(int*) 1776; //1776이라는 주소를 p에 넣어줌.(절대 주소)

문자열

  • char의 1차원 배열
  • 가장 마지막은 end-of-string을 나타내는 null문자로 끝남
  • 문자열의 크기는 null을 포함해야 함 ("abc"의 char 배열의 크기는 4)
cf)
문자열 상수는 배열의 이름처럼 pointer로 취급!
#include <stdio.h>

int main() {
    char *p="abc";

    printf("%s\n", p);

    printf("%s\n", p+1);

    return 0;
}
abc
bc

문자열 상수는 주소

  • 같은 문자열 리터럴을 여러 번 사용할 경우
  • 컴파일러는 리터럴 중 하나만 메모리에 저장하고 주소를 공유함.
#include <stdio.h>

int main() {
    printf("%p\n", ("apple"));
    printf("%p\n", ("apple")+1);
    printf("%c\n", *("apple"));
    printf("%c\n", *("apple"+1));
    printf("%c", ("apple")[2]);
}
0x5f2ad357b004
0x5f2ad357b005
a
p
p
  • 하지만 문자열 리터럴은 수정할 수 없다.

문자열 초기화

  • 문자 상수로 하나씩 저장하거나 한 번에 초기화하는 방식이 있음.
char a[14]={'a', 'b', 'c', 'd'};
char b[14]="abcd";
  • 널 문자를 저장할 공간도 필수임.
cf)
char *p="abcd";​


-p라는 주소로 메모리 공간을 할당해 줌.

char a[]="abcd";


-문자열 길이+1만큼의 메모리를 할당해 줌.

char 배열의 초기화

  • scanf()로 입력 값을 받을 때는 배열명만 사용함. (&사용 안 함)
#include <stdio.h>

int main() {
      char a[]="abcdefg";
      
      printf("%s\n",a);
      scanf("%s", a);
      printf("%s", a);
}
  • 초기 배열은 abcdefg이지만 입력을 받은 이후에는 값을 덮어 씌움.
처음
a b c d e f g \0..

입력 후
a b c d \0 f g \0..

문자열 대입

  • 초기화 이후에도 새로운 문자열 저장 가능
  • 일반 변수처럼 대입 연산은 불가!
char a[14];
a="abcd";
  • strcpy 함수: char형 배열에 새 문자열을 저장할 때 사용함.
#include <stdio.h>
#include<string.h>

int main() {
      char a[14]="abcdefg";
      char b[14];
      
      strcpy(b,a);
      
      printf("%s %s", a, b);
}
abcdefg abcdefg

문자열 전용 입출력 함수

#include <stdio.h>
#include <string.h>

int main() {
    char s[84];

    fgets(s, sizeof(s), stdin);

    s[strlen(s)]='\0';

    puts(s);

    return 0;
}
  • fget을 활용하여서 문자열을 입력받고, puts를 활용하여서 출력 가능하다.

문자열과 null 문자

  • Null문자가 마지막에 없을 경우에는 이어진 메모리 영역도 출력하면서 쓰레기 값을 출력한다.

Ragged Arrays

  • 각 행마다 열의 개수가 다른 배열
  • 가변적인 크기의 배열을 가리키는 포인터들이 모든 배열!
char a [2][15]={"abc:", "a is a apple"};
-30개의 저장 공간 할당

char *p [2]={"abc:", "a is a apple"};
-char를 가리키는 pointer들의 1차원 배열
-2개의 pointer를 저장하기 위한 공간 할당
-초기화 후에는 문자열을 초기화할 수 없음.
-mapping 함수를 활용하지 않아서 a배열보다 빠름!
  • 포인터 변수와 배열 인덱스 사이의 메핑에 대해서 본다면 다음과 같다.
#include <stdio.h>
#include <string.h>

int main() {
    int a[2][3]={1,2,3,4,5,6};
    
    printf("%d\n", a[1][2]);
    printf("%d", *(&a[0][0]+5));
}

 

'프로그래밍1및실습' 카테고리의 다른 글

week3(실습 문제)  (0) 2025.05.22
week2(실습 문제)  (0) 2025.05.22
4주차  (0) 2025.04.30
3주차(2)  (0) 2025.04.30
3주차  (0) 2025.04.08