목차
<배열>
[배열 응용]
<결과>
<포인터>
[포인터 응용]
<실행>
<결과>
[배열 응용]
<결과>
<포인터>
[포인터 응용]
<실행>
<결과>
본문내용
ude
void main()
{
int nArray[9] = {84,43,64,6,3,18,92,77,24};
int nMax = nArray[0];
int nMin = nArray[0];
for(int i =0; i< 9; i++)
{
if(nArray[i] > nMax) nMax = nArray[i];
if(nArray[i] < nMin) nMin = nArray[i];
}
printf("\n최소 : %d, 최대 : %d \n", nMin, nMax);
}
<결과>
-최소 3, 최대 92
<포인터>
-포인터의 간단한 요점으로는 포인터 형을 선언할 때는 *을 사용한다. 포인터의 형은 포인터의 연산시 데이터 형의 크기만큼 이동한다. 동적 메모리 할당은malloc함수를 이용하여 메모리를 할당하고 할당된 메모리를 포인터가 가르킨다.
포인터란 메모리의 주소 값을 저장하기 위한 변수이다.
즉, 포인터는 기본 자료형 변수와 달리 메모리 공간의 주소 값을 저장하는데 사용되는 변수를 말하는 것이다. 그래서 흔히 포인터가 변수라는 것을 강조하기 위해서 ‘포인터 변수’라는
표현을 쓴다. 많은 사람들이 포인터와 포인터 변수를 다른 것으로 이해하는데 포인터와 포인터 변수는 같은 것이다.
포인터 선언은 다음과 같이 할 수 있다.
void main()
{
int *a;
char *b;
double *c;
포인터를 선언할 때에는 *연산자를 사용한다.
a는 int형 포인터를 선언하고 b는 char형 포인터를 c는 double형 포인터를 선언하고 있다.
여기서 포인터에도 타입이 존재한다는 것을 알 수 있다.
변수의 이름 앞에 &연산자를 붙이게 되면 해당 변수의 주소 값이 반환된다.
void main()
{
int a=2005;
int* pA=&a;
대입 연산자 오른쪽에 있는 문장 “&a”는 "변수 a의 주소 값을 반환하라“는 의미를 지닌다.
int a,
*pA;
위는 int형 변수 a와, int형 포인터 변수 pA의 선언되었는데 위와 같이 일반 변수와 포인터 변수를 동시에 선언 하는 것도 가능하다.
#include
void main()
{
int a=10;
int *pA=&a;
double e=3.14;
double *pE=&e;
printf("%d %f", *pA, *pE);
}
위에서 pA라는 포인터가 int형 포인터이기 때문에 4바이트를 읽어 들이고, pE라는 포인터는 double형이기 때문에 8바이트를 읽어 들인다. 즉, 포인터에 타입이라는 것이 존재하지 않는다면, 포인터를 이용해서 변수를 참조하는 경우 몇 바이트를 읽어 들여야 할 지 알 수 없게 된다. 즉, 포인터는 메모리를 참조하는 방법을 알려주는 역할을 한다.
포인터는 메모리의 주소 값을 나타내므로, 사용하는데 있어서 상당한 주의를 요구한다.
다음 소스는 잘못된 포인터 사용의 예 이다.
void main()
{
int *pA;
*pA=10;
}
위는 pA라는 포인터 변수를 선언만 하고 초기화 하지 않았다. 즉 pA값은 쓰레기 값으로 초기화된다 pA라는 포인터가 가리키는 메모리 공간에 10이라는 정수 값을 대입하고 있다. 그러므로 이 소스는 오류를 지니고 있다.
비슷한 다른 예를 들면,
void main()
{
int* pA=100;
*pA=10;
}
포인터는 가급적 선언과 동시에 초기화를 시켜주면 좋다고 해서 위와 같이 초기화를 하면 더 망치고 만다. 결국 포인터는 특성상 위험의 요소를 지닐 수밖에 없다.
[포인터 응용]
포인터를 이용한 두 정수의 최소 공약수 최대 공배수를 구하는 소스
#include
int gcd(int*, int*);
int lcm(int*, int*);
void main()
{
int a, b, val_gcd, val_lcm;
printf("두 정수를 입력하시오 : ");
scanf("%d %d", &a, &b);
val_gcd = gcd(&a, &b);
val_lcm = lcm(&a, &b);
printf("GCD : %d \nLCM : %d \n", val_gcd, val_lcm);
}
int gcd(int *x, int *y)
{
int temp = *x % *y;
if(temp == 0){
return *y;
}
return gcd(y,&temp);
}
int lcm(int *x, int *y)
{
return (*x) * (*y) / gcd(x,y);
}
<실행>
-두 정수의 입력이 18, 42
<결과>
-최소:6 최대:126
void main()
{
int nArray[9] = {84,43,64,6,3,18,92,77,24};
int nMax = nArray[0];
int nMin = nArray[0];
for(int i =0; i< 9; i++)
{
if(nArray[i] > nMax) nMax = nArray[i];
if(nArray[i] < nMin) nMin = nArray[i];
}
printf("\n최소 : %d, 최대 : %d \n", nMin, nMax);
}
<결과>
-최소 3, 최대 92
<포인터>
-포인터의 간단한 요점으로는 포인터 형을 선언할 때는 *을 사용한다. 포인터의 형은 포인터의 연산시 데이터 형의 크기만큼 이동한다. 동적 메모리 할당은malloc함수를 이용하여 메모리를 할당하고 할당된 메모리를 포인터가 가르킨다.
포인터란 메모리의 주소 값을 저장하기 위한 변수이다.
즉, 포인터는 기본 자료형 변수와 달리 메모리 공간의 주소 값을 저장하는데 사용되는 변수를 말하는 것이다. 그래서 흔히 포인터가 변수라는 것을 강조하기 위해서 ‘포인터 변수’라는
표현을 쓴다. 많은 사람들이 포인터와 포인터 변수를 다른 것으로 이해하는데 포인터와 포인터 변수는 같은 것이다.
포인터 선언은 다음과 같이 할 수 있다.
void main()
{
int *a;
char *b;
double *c;
포인터를 선언할 때에는 *연산자를 사용한다.
a는 int형 포인터를 선언하고 b는 char형 포인터를 c는 double형 포인터를 선언하고 있다.
여기서 포인터에도 타입이 존재한다는 것을 알 수 있다.
변수의 이름 앞에 &연산자를 붙이게 되면 해당 변수의 주소 값이 반환된다.
void main()
{
int a=2005;
int* pA=&a;
대입 연산자 오른쪽에 있는 문장 “&a”는 "변수 a의 주소 값을 반환하라“는 의미를 지닌다.
int a,
*pA;
위는 int형 변수 a와, int형 포인터 변수 pA의 선언되었는데 위와 같이 일반 변수와 포인터 변수를 동시에 선언 하는 것도 가능하다.
#include
void main()
{
int a=10;
int *pA=&a;
double e=3.14;
double *pE=&e;
printf("%d %f", *pA, *pE);
}
위에서 pA라는 포인터가 int형 포인터이기 때문에 4바이트를 읽어 들이고, pE라는 포인터는 double형이기 때문에 8바이트를 읽어 들인다. 즉, 포인터에 타입이라는 것이 존재하지 않는다면, 포인터를 이용해서 변수를 참조하는 경우 몇 바이트를 읽어 들여야 할 지 알 수 없게 된다. 즉, 포인터는 메모리를 참조하는 방법을 알려주는 역할을 한다.
포인터는 메모리의 주소 값을 나타내므로, 사용하는데 있어서 상당한 주의를 요구한다.
다음 소스는 잘못된 포인터 사용의 예 이다.
void main()
{
int *pA;
*pA=10;
}
위는 pA라는 포인터 변수를 선언만 하고 초기화 하지 않았다. 즉 pA값은 쓰레기 값으로 초기화된다 pA라는 포인터가 가리키는 메모리 공간에 10이라는 정수 값을 대입하고 있다. 그러므로 이 소스는 오류를 지니고 있다.
비슷한 다른 예를 들면,
void main()
{
int* pA=100;
*pA=10;
}
포인터는 가급적 선언과 동시에 초기화를 시켜주면 좋다고 해서 위와 같이 초기화를 하면 더 망치고 만다. 결국 포인터는 특성상 위험의 요소를 지닐 수밖에 없다.
[포인터 응용]
포인터를 이용한 두 정수의 최소 공약수 최대 공배수를 구하는 소스
#include
int gcd(int*, int*);
int lcm(int*, int*);
void main()
{
int a, b, val_gcd, val_lcm;
printf("두 정수를 입력하시오 : ");
scanf("%d %d", &a, &b);
val_gcd = gcd(&a, &b);
val_lcm = lcm(&a, &b);
printf("GCD : %d \nLCM : %d \n", val_gcd, val_lcm);
}
int gcd(int *x, int *y)
{
int temp = *x % *y;
if(temp == 0){
return *y;
}
return gcd(y,&temp);
}
int lcm(int *x, int *y)
{
return (*x) * (*y) / gcd(x,y);
}
<실행>
-두 정수의 입력이 18, 42
<결과>
-최소:6 최대:126
추천자료
- 자료구조 배우기전 기초 자바 2
- 자바 자료구조 중간고사
- 알파벳의 기원과 발전
- C언어 프로그래밍에 관한 기초적인 이해
- C로 배우는 프로그래밍 기초 12장 이해점검 풀이
- 향두 이결 구결
- [한국어교육]원격교육 방식을 통한 한국어 교재개발 및 교사교육
- [특허][특허제도][특허출원][특허권][특허침해][특허침해소송]특허의 의미, 특허의 대상, 특...
- C# 즐겨찾기
- 모세오경의문화적배경(G. 허버트 리빙스톤)
- 버스노선(C언어)
- [운영체제(OS) Shell(셸) 구현]운영체제(OS) Shell 구현 (소스포함)
- [독후감] 김훈의 소설 ‘남한산성’
- 자바 계산기 만들기 과제
소개글