1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
void maxmin(int **max, int **min, int *arr);
 
int main(){
    int *max, *min, arr[5];
    
    for(int i=0;i<sizeof(arr)/sizeof(int);i++)
        cin>>arr[i];
    
    maxmin(&max,&min,arr);
    
    cout<<"\n"<<*max<<"\n"<<*min;
}
 
void maxmin(int **max, int **min, int *arr){
    *max=*min=arr;
    
    for(int i=1;i<sizeof(arr)/sizeof(int);i++){
        if (**max<*(arr+i))
            *max=(arr+i);
        if (**min>*(arr+i))
            *min=(arr+i);
    }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
 
using namespace std;
 
int insertlist(int list[], int n, int *length, int i, int x); // i번째 위치에 원소 x를 추가함
int deletelist(int list[], int n, int *length, int i); // i번째 원소 삭제
void printflist(int* list, int* length); // 출력 함수
 
int main() {
    int a[50], lena = 0;
    int b[30], lenb = 0, temp;
 
    insertlist(a, 50, &lena, 010); //a 리스트에 0번째열에 10을 초기화
    insertlist(a, 50, &lena, 115); //a 리스트에 1번째열에 15을 초기화
    insertlist(b, 30, &lenb, 020); //b 리스트에 0번째열에 20을 초기화
    insertlist(a, 50, &lena, 225); //a 리스트에 2번째열에 25을 초기화
    insertlist(a, 50, &lena, 330); //a 리스트에 3번째열에 30을 초기화
    insertlist(b, 30, &lenb, 135); //b 리스트에 1번째열에 35을 초기화
    insertlist(b, 30, &lenb, 240); //b 리스트에 2번째열에 40을 초기화
    insertlist(a, 50, &lena, 445); //a 리스트에 4번째열에 45을 초기화
    insertlist(b, 30, &lenb, 350); //b 리스트에 3번째열에 50을 초기화
    deletelist(b, 30, &lenb, 1); // b리스트의 1번째 배열 삭제
    deletelist(b, 30, &lenb, 1); // b리스트의 1번째 배열 삭제 (책이 잘못됐는지 똑같은게 두줄이 있습니다..)
    insertlist(b, 30, &lenb, 455); //b 리스트에 4번째열에 55을 초기화
    deletelist(a, 50, &lena, 3); // a리스트의 3번째 배열 삭제 
    deletelist(a, 50, &lena, 4); // b리스트의 4번째 배열 삭제
    insertlist(a, 50, &lena, 460); //a 리스트에 4번째열에 60을 초기화
    insertlist(a, 50, &lena, 570); //a 리스트에 5번째열에 70을 초기화
 
    printflist(a, &lena); // a리스트 출력
    printflist(b, &lenb); // b리스트 출력
}
 
int insertlist(int list[], int n, int * length, int i, int x)
{
    int j;
    if (i<0 || i>*length + 1return 0// 저장할 배열번호가 0보다 작거나 남은 길이와 맞지 않다면 함수 종료
    if (*length + 1 == n) return 0// 늘어나는길이 length가 n(50) 이라면 함수 종료 (저장공간 x)
    for (j = *length; j >= i; j--) list[j + 1= list[j]; // 다음 번호로 밀어내어 저장
    list[i] = x; // 추가할 열에 입력한 변수 x저장
    *length = *length + 1// 남은 길이 계산
    return 1;
}
 
int deletelist(int list[], int n, int *length, int i)
{
    int temp, j;
    if (i<0 || (i>*length)) return -1// 배열길이나 입력한 번호가 잘못됐다면 함수 종료
    temp = list[i]; // 삭제할 열 변수 temp에 저장
    for (j = i + 1; j <= *length; j++) list[j - 1= list[j]; // 왼쪽으로 한칸씩 땡기기
    *length = *length - 1// 남은 길이 감산
    return (temp);
}
 
void printflist(int * list, int * length)
{
    for (int i = 0; i < *length; i++// 길이에 맞춰 출력
        cout << *(list + i) << " "// 포인터 list로 배열 참조하여 출력
    cout << "\n";
}
cs

'C++ > 자료구조' 카테고리의 다른 글

c++ 자료구조 버블정렬  (0) 2016.04.02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
 
using namespace std;
 
void desSort(int *p, int length);
 
int main() {
    int a[7];
    int length = sizeof(a) / sizeof(int);
 
    for (int i = 0; i < 7; i++) {
        cout << i + 1 << "번째 입력:";
        cin >> a[i];
    }
 
    desSort(a, length);
 
    for (int i = 0; i < length; i++) {
        cout << a[i] << " ";
    }
}
 
void desSort(int *p, int length) {
    int  tmp, count = 0;
    for (; count < length - 1;) {
        count = 0;
        for (int i = 0, j = 1; j < length; i++, j++) {
            if (p[i] > p[j]) {
                tmp = p[j];
                p[j] = p[i];
                p[i] = tmp;
            }
            else
                count++;
        }
    }
}
cs


'C++ > 자료구조' 카테고리의 다른 글

c++ 자료구조 순서리스트  (0) 2016.04.03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
using namespace std;
 
int main() {
    int i, length, count = 0;
    char c[100];
 
    cin >> c;
 
    for (i = 0; c[i] != NULL; i++); // 길이 구하기
 
    length = i;
 
    for (i = 0; i < length; i++)
        if (c[i] != c[length - 1 - i])
            count++;
 
    if (count > 0 || length < 3) {
        cout << "화문이 아닙니다.\n";
        return 0;
    }
 
    else
        cout << "화문 입니다.\n";
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
using namespace std;
 
int main() {
    int a;
 
    cout << "10진수 입력:";
    cin >> a;
 
    for (int i = 7; i >= 0; i--
        cout<<(a >> i & 1 ? 1 : 0);
}
cs


'C++ > 알고리즘' 카테고리의 다른 글

c++ 포인터 call by reference 콜 바이 레퍼런스  (0) 2016.04.06
c++ 알고리즘 회문 체크  (0) 2016.04.02
c++ 홀수 왼쪽 짝수 오른쪽  (0) 2016.04.02
c++ 알고리즘 텍스트 개수 세기  (0) 2016.03.31
c++ 숫자야구  (0) 2016.03.29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
using namespace std;
 
void hs(int *hs);
void js(int *js);
 
int main() {
    int a[10];
 
    for (int i = 0; i < 10; i++) {
        cout << i << "번 째 입력:";
        cin >> a[i];
    }
 
    hs(a);
    js(a);
 
void hs(int *hs) {
    for (int i = 0; i < 10; i++) {
        if (*(hs + i) % 2 == 1)
            cout << *(hs + i) << ",";
    }
    cout << endl;
}
 
void js(int *js) {
    for (int i = 0; i < 10; i++) {
        if (*(js + i) % 2 == 0)
            cout << *(js + i) << ",";
    }
    cout << endl;
}
cs




개강한지 한달, 전역한지는 약 네달이 지났으니 21개월+4개월 시간이 흘러서인지 포인터를 배웠었는지 조차 기억이 나지 않았다.


후배 학번들이 포인터 배열, 배열 포인터에 대한 개념을 막힘없이 이해하고,


포인터 개념조차 까먹은 본인을 포함한 동기 복학생들이 멘붕에 빠진 상황을 겪게 되며 슬럼프가 찾아오게 되었다.


그래서 불쌍한 복학생들을 구원해주실 바이블인 열혈강의c를 꺼내어 포인터에 대해 정독한 후 복습차원에서 글을 써본다.


포인터를 공부할때 멘탈이 붕괴되는 이유는 '포인터를 왜 써야하는지'와 '포인터가 대체 무엇인가?' 같은


현재 수준에선 절때 답이 나오지 않을 질문들을 스스로에게 던져 자학하게 되어 포기하는 것 같다.


그래서 이번에 포인터를 공부할 때는 그런 질문들은 잊어버리고 한칸씩, 한칸씩 책에서 알려주는 계단을 오르듯이 공부를 했다. 




- - - - - - - - - - - - - - - - - - - - - - - - - - - - -



포인터는 메모리의 주소 값을 저장하기 위한 변수이다.



1
2
3
4
5
int main() {
    char c = 'a';
    int n = 7;
    double d = 3.14;
}
cs


책에 나오는 예제를 하나 참조했다. 


위에 코드를 실행하게 되면 메모리 상에는


1바이트를 가진 c, 4바이트를 가진 n, 8바이트를 가진 d 변수가 할당되고 각각의 변수들은 주소를 가지게 된다.


예를들어 c는 1000, n은 1001-4, d는 1005-c 와 같은 주소를 가지게 된다.


포인터는 다른 변수들에 주소 값들을 참조(사용)하기 위한 변수이다.


char c는 a란 값을 int n은 7을, double d는 3.14란 값을 가지듯이 포인터 p 는 1000, 1001, 1005 와 같은 자신이 참조할 변수의 주소값들을 변수로 가진다는 말이다.


예를들어 p라는 포인터가 변수 char c를 가르키게 되면 p 는 1000라는 c의 주소값을 변수로 가지게 될것이다. 


또한 p도 변수이기 때문에 자신의 주소값을 가지게 된다. 




- - - - - - - - - - - - - - - - - - - - - - - - - - - - -



포인터 선언 방법


1
2
3
4
int main() {
    int a = 2005;
    int *= &a;
}
cs


포인터를 선언할 때에는 * 연산자를 사용한다.


또 포인터에도 char, int, double 과 같은 타입이 존재한다. 


포인터가 참조할 변수의 자료형에 따라서 적절한 타입의 포인터를 선언해야 한다.




- - - - - - - - - - - - - - - - - - - - - - - - - - - - -



포인터 참조 연산자



& 연산자포인터가 가르키는 변수의 주소값을 반환할 때 사용한다.


int *p = &a; 는 포인트p가 a의 주소값을 변수로 가지게 된다.


* 연산자변수를 참조하는 연산자이다.


1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main() {
    int a = 2005;
    int *= &a;
 
    std::cout << p << "\n";
    std::cout << *<< "\n";
}
cs


5번째 줄에서 포인터 p에 &연산자를 붙여 변수 a의 주소값을 초기화 하고 있다.


7번째 줄에서 &a를 변수로 가진 p를 출력하니 a의 주소값이 출력될것이다.


8번째 줄은 변수를 참조하는 연산자인 *가 붙어 있으니 p가 가르키는 주소에 변수를 참조 한다는 말이니 a의 변수인 2005가 출력되는것이다.



다음 예제는 지금까지 배운 선언, 참조와 더불어 포인터를 이용한 연산이 이뤄지는 예제이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int main() {
    int a = 2005;
    int* p = &a;
 
    cout << p << "\n";
    cout << &a << "\n";
 
    (*p)++;
    cout << a << "\n";
    cout << *<< "\n";
}
cs

 

6번째 줄에서 정수형 a를 선언해 2005를 초기화 했고, 포인터 p를 선언해 a의 주소값을 참조하였다.


9번째 줄에서 출력하는 p는 a의 주소값이 출력될것이고 10번째 줄에 주소반환 연산자가 붙은 &a도 a의 주소값을 출력하게 된다. 


이 예제에서 주목해야 할 곳이 12번째 줄이다. 가르키는 주소의 변수를 참조하는 *가 붙은 p의 값을 1 증가 시키고 있다.


p가 가르키는 주소가 a이고 a의 값이 2005이기 때문에 2005의 값이 하나 증가하여 2006이 되는것이다.


그래서 13번째 줄에 출력하는 a의 값은 2006이 될것이고 *p의 값도 2006이 출력된다.




1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main(){
    int count=0;
    char *a= "text @ ";
    for(int i=0*(a+i) !=NULL; i++) {
        if (*(a+i) != NULL && *(a+i) != ' ') count++;
        if (32 <= *(a+i) => 64) count++;
    }
    std::cout<<count<<"\n";
}
cs


+ Recent posts