챕터 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));
}
'프로그래밍 > 알고리즘' 카테고리의 다른 글
쉬운 스택 알고리즘 - C언어 (2) | 2022.09.20 |
---|---|
4. do it! 03-1 검색 (선형, 이진) ,복잡도 - C언어 (0) | 2022.07.27 |
3. do it! 02-2 기본 자료구조 (정렬, 소수) -c언어 (0) | 2022.07.26 |
1. do it! 자료구조와 함께 배우는 알고리즘 입문 - c언어 (0) | 2022.07.25 |