프로그래밍/알고리즘

2. do it! 02-1 기본 자료구조 (포인터, 배열, 난수(랜덤 수))- c언어

량아이 2022. 7. 26. 18:03

챕터 2에 들어가자 마자 배열을 설명하면서 배열의 크기 선언에 대해 설명하는데

중간중간에 내가 좀 어려워하는 포인터도 들어가서 하나하나 따라해보면서 이해해보려고 했다..

 

했었으나....

왜!!!!!

하핫 처음 코드부터 개같이 멸망 ㅎㅎㅎㅎㅎ

뭐라하는지 봤더니

호환되지 않는 유형 'void *'에서 'int *'에 할당됨

 

 

 

음음 코드에 대한 설명은

호출한 calloc 함수는 지정된(1 * sizeof(int) 바이트) 크기의 메모리를 힙 영역에 할당하고, 할당한 메모리의 첫번째 주소를 반환합니다. 할당한 메모리가 필요없어지면 포인터를 free 함수에 전달해 메모리를 해제합니다.

라고한다!

 

자료형이 int형이고, 요소 개수가 n인 배열 생성 calloc(n,sizeof(int))

 

포인터(pointer)란?

객체(변수) 또는 함수를 가리키는 것

 

p가 n을 가리킨다면 p가 가리키는 곳에 있는 n의 값을 접근하는 식은 *p입니다.

*p =999;    //p가 가리키는 곳에 999를 대입한다

다시말해

p 와 &n 이 같고

*p 와 n이 같다고 할 수 있다.

포인터 p가 배열의 요소 n을 가리킬 때
요소 n의 i개만큼 뒤쪽의 요소를 나타내는 *(p+i)는 p[i]로 표기할 수 있고,  ex)*(p+2) 은 n[0]의 2개만큼 뒤인 n[2]를 가리킨다
요소 n의 i개만큼 앞쪽의 요소를 나타내는 *(p-i)는 p[-i]로 표기할 수 있다.  ⎷p[2]는 n[2]와 같다!

공백 포인터와 NULL

공백포인터(null pointer)

NULL- 값 0을 갖는 모든 정수, 상수 또는 상수식을 void*로 형변환한 식

함수포인터 - 함수를 가리키는 포인터 

 

 

배열요소 최대값 구하기

max = a[0];
for(i =1; i<n;i++)
	if(a[i]>max) max=a[i];

배열 요소를 하나씩 차례로 살펴보는 과정을 주사(traverse)라고 한다.

 

난수 생성(srand(), rand())

난수는 <stdlib.h> 이 헤더파일을 사용한다

rand 함수가 반환하는 값은 0이상 RAND_MAX 이하의 값인데 이 RAND_MAX의 값은 컴퓨터 환경에 따라 다르다.

x = rand(); //0이상 RAND_MAX 이하의 난수를 생성
y = rand(); //0이상 RAND_MAX 이하의 난수를 생성

이렇게 입력했을 때 x 와 y는 각각 다른 값을 출력하지만 프로그램을 다시 실행해봐도 출력되는 값은 각각 같다.

 

몇번이고 다시 디버깅해봐도 

x=16807 

y=282475249

로 값이 같다

왜냐하면 rand 함수는 seed(씨앗)을사용하여 난수를 생성하기 때문이다.

              ex)seed가 1일경우 상숫값 1을 기준으로 매번 같은 순서의 난수를 생성

이때 seed의 값을 변경하는 함수가 바로 srand()이다.

srand(50);    //seed를 50으로 설정

하지만 이렇게 설정을 해버리면 이전과 같이 seed가 1이었을때처럼 항상 같은 순서로 난수가 생성이 될것이다. 그렇기때문에 srand()에 전달되는 매개변수를 난수로 주어야 하는데,

이 문제를 해결하기위해 일반적으로 사용하는 방법은 srand()의 매개변수에 현재의 시간의 값을 주는것이다.

 

이를 토대로 아래의 코드를 해석해보면

#include <time.h> //시간
#include <stdio.h>
#include <stdlib.h> //난수
int maxof(int a[], int n){
    int i;
    int max=a[0];
    for(i=1; i<n; i++){
        if(a[i]>max) max=a[i];
    }
    return max;
}
int main(){
    int num;
    scanf("%d",&num);
    int hi[num];
    srand(time(NULL)); //시간으로 난수의 seed를 초기화
    for(int i=0; i<num; i++){
        hi[i]=100+rand()%90; //값을 90으로 나눈 값의 나머지 즉 89까지의 랜덤 값 +100,
                             //100 ~ 189의 난수를 생성
        printf("%d\n",hi[i]);
    }
    printf("촤대값은 %d\n", maxof(hi,num));
}