검색결과 리스트
글
1. char *p = "ABCDEFG"의 형태일 때 각각의 차이점은 무엇인가?
① *( p+3 )
② ( *p ) +3
③ *p + 3
④ p + 3
< 1번 소스코드 >
< 실행 결과 >
< 설명 >
*p 는 "ABCDEFG" 의 주소값이다.
내가 위의 보기에서 1, 2, 3은 "ABCDEFG"의 주소값을 보니 5fbff808가 나왔는데,
여기에서 3을 더하면 5fbff80b가 되어 "D"가 출력되게 된다.
반면, 4번은 그냥 p에 3을 더했기 때문에 이상한 값이 나온다.
2. char *p = {"ABCDE","KBS","XYZ"}; 일 때 다음 명령어들의 차이점은 무엇인가?
① p++
② *p++
③ (*p)++
< 소스 코드 >
1번 소스코드 :
2번 소스코드 :
3번 소스코드 :
-> 1, 2 출력 결과
-> 3 출력 결과
< 설명 >
2번 문제를 설명하기 위하여 한가지 코드를 짜보았다.
위의 문제의 1, 2, 3번의 차이는 *연산자와 ++연산자의 우선순위 차이이다.
32비트 운영 체제의 경우에 주소가 0x4씩 커진다.
*p++ = p가 가진 주소가 0x10인 경우, 0x14로 바뀐다.
(*p)++ = p가 가진 주소가 0x10인 경우, 0x10에 1이라는 값을 가지는 경우, 주소 0x10의 값이 2로 바뀐다.
*(p++) = *p++
이런 차이가 있다.
3. 다음 프로그램의 출력 결과를 예측해보아라.
나는 *c 라는 것은 주소값을 가리켜야 하는데 가르켜야 할 주소값이 없으니 입력을 받고 출력을 하지 못할 것 같다고 생각했다.
< 결과 >
내 생각이 맞았다. 난 Xcode를 사용해서 다른데에서는 어떻게 반응할지는 모르겠지만, 에러가 났다.
.
.
코드를 수정하여 이 코드가 돌아갈 수 있도록 해 보았다.
*c 라는 포인트 배열이 input 이라는 배열을 가리키게 하여 코드가 실행될 수 있도록 하였다.
▼▼▼ 출력 결과 실행이 잘 된다 ▼▼▼
4. char * p[] = {"ABC","XY","BJW","JMLEE"}; 일 때 다음 각각의 포인터의 연산 결과를 구하여라.
① *p
② *p([2] + 1)
③ *(*(p + 3) + 2)
1번만 실행할 경우 A가 출력 되지만, 2~3번은 에러가 나며 출력되지 않는다.
내가 예상한 결과는 2번의 경우 p[2]는 "BJW" 이고 +1이니 J를 예상하였고,
3번의 경우 *(p+3)은 p[3]이고 여기에 +2이니 L을 예상하였는데 에러가 나서 당황하였다.
내가 포인터를 잘못 이해하고 있는건지 모르겠다.
▶ 제가 만약 잘못하고 있는게 있으면 댓글로 달아주면 감사하겠습니다.
5. 입력받은 문자열 거꾸로 출력하는 프로그램을 만들어라.
< 코드 설명 >
위의 코드는 p 포인터 배열을 만든 뒤, Input을 받고, p[i]을 NULL 전까지 주소값를 증가시켰다.
마지막으로 for문으로 NULL 전부터 0까지 출력하게 하여 거꾸로 출력하는 프로그램을 만들어 보았다.
< 출력 결과 >
6. a가 배열이고, b가 문자열의 포인터일 때 배열 a에 b 문자열을 복사하는 함수를 만들어라.
< 코드 설명 >
이 코드는 a 배열과 b 포인터 배열을 선언하여 a를 입력받고 strcpy를 사용하여 b에 a를 저장하여 Output으로 b를 출력하였다.
결과는 아래와 같이 제대로 되었다.
7. char c[]="ABCDE" 일 때, c++과 같은 명령을 사용할 수 없는 이유를 구하여라.
c[]는 일반 배열이기 때문에 문자여서 c++를 하면 오류가 나게된다.
하지만 char *c[]를 하여 포인트 배열로 만들면 주소값의 형태를 띄게 되어 c++를 하면 주소값+1이 되어,
A의 주소값 +1 = B가 되어 BCDE가 출력되게 된다.
'Programming > C' 카테고리의 다른 글
함수 포인터 (0) | 2015.08.27 |
---|---|
[ Project ] Wild! (0) | 2015.08.27 |
[ Project ] Stack_Linked List (0) | 2015.08.27 |
연결 리스트 ( Linked List ) (0) | 2015.08.27 |
구조체 ( Struct ) (0) | 2015.08.27 |
RECENT COMMENT