'C'에 해당되는 글 17건
- 2011.01.09 string processing
- 2010.06.26 itoa 대신 sprintf
- 2010.06.26 volatile
- 2010.06.24 포인터 상수
- 2010.06.13 문자열
- 2010.06.12 구조체
- 2010.06.09 버블 정렬 c 0609
- 2010.06.08 다중포인터
- 2010.06.06 16진수 0xffffffff의 값 (signed and unsigned)
- 2010.06.06 형식 지정자
'C' 카테고리의 다른 글
itoa 대신 sprintf (0) | 2010.06.26 |
---|---|
포인터 상수 (0) | 2010.06.24 |
문자열 (0) | 2010.06.13 |
구조체 (0) | 2010.06.12 |
버블 정렬 c 0609 (0) | 2010.06.09 |
#include <stdio.h>
int main(void) {
int arr[4] = {1, 2, 3, 4};
printf("&arr = %p\n", &arr); // 0012FF54
printf("arr = %p\n", arr); // 0012FF54
printf("&arr[0] = %p\n", &arr[0]); // 0012FF54
return 0;
}
arr과 &arr 이 출력하는 메모리주소는 분명 같습니다만,
그 의미에는 미묘한 차이가 있습니다.
익히 아시고 계신 것처럼 arr은 &arr[0] 과 같은 의미이며, 그 data type은 배열의 data type입니다.
즉 arr + 1의 의미는 arr[0]에서 int형의 size만큼, 4byte 이동한 주소, &arr[1]을 의미할 수 있습니다
하지만 &arr은 그렇지 않습니다. &arr은 arr이라는 이름의 int형 4개짜리 일차원 배열의 시작주소입니다.
이것은 즉 (&arr) + 1 이 &arr[1] 을 의미하지 않음을 말합니다.
이러한 맥락에서 (&arr) + 1은 arr[0]에서 int형의 size*배열의 데이터 갯수(4) 를 곱한만큼 이동한 곳
의 주소입니다. 다음의 코드를 봐주세요.
int a[4] = {0, 1, 2, 3};
int (*pa)[4] = &a; /* 그냥 a를 쓰면 에러가 납니다 &a[0]과 &a는 의미하는 바가 달라서입니다
pa는 int형의 데이터 4개를 가지는 일차원배열을 가리키는 포인터입니다 */
pa++; /* 메모리 주소가 sizeof(int) * 4(배열데이터갯수) 만큼 이동합니다 */
printf("%d\n", (*pa)[-1]); /* pa가 가리키는 일차원 배열을 참조한 후 -1 인덱스,
즉 이는 a[3]을 의미합니다 */
출력되는 값은 물론 3입니다 :)
PS) int (*pa)[4]; /* 위에 나온대로 일차원배열을 가리키는 포인터를 선언합니다 */
int *pa[4]; /* int형의 포인터 4개를 가지는 일차원배열을 선언합니다 */
'C' 카테고리의 다른 글
itoa 대신 sprintf (0) | 2010.06.26 |
---|---|
volatile (0) | 2010.06.26 |
문자열 (0) | 2010.06.13 |
구조체 (0) | 2010.06.12 |
버블 정렬 c 0609 (0) | 2010.06.09 |
'C' 카테고리의 다른 글
포인터 상수 (0) | 2010.06.24 |
---|---|
문자열 (0) | 2010.06.13 |
버블 정렬 c 0609 (0) | 2010.06.09 |
다중포인터 (0) | 2010.06.08 |
16진수 0xffffffff의 값 (signed and unsigned) (0) | 2010.06.06 |
버블 정렬
Output: |
#include <stdio.h> int main() { int i, j; int array[3][4] = { {15, 23, 45, 56}, {34, 53, 76, 23}, {98, 29, 48, 43}}; int *p = *array; for (i = 0; i < 12; ++i) { printf("%d ", *(p+i)); } printf("\n"); return 0; } |
배열과 포인터 값과 주소 관계
Output: |
#include <stdio.h> int main() { int i = 100; int *p = &i; int **pp = &p; int ***ppp = &pp; printf(" i = 100; --> i = %d\n", i); *p = 90; printf(" *p = 90; --> i = %d\n", i); **pp = 80; printf(" **pp = 80; --> i = %d\n", i); ***ppp = 70; printf("***ppp = 70; --> i = %d\n", i); return 0; } Result-------------------------------------------------------------------------------------------------------------- i = 100; --> i = 100 *p = 90; --> i = 90 **pp = 80; --> i = 80 ***ppp = 70; --> i = 70 Result-------------------------------------------------------------------------------------------------------------- |
'C' 카테고리의 다른 글
구조체 (0) | 2010.06.12 |
---|---|
버블 정렬 c 0609 (0) | 2010.06.09 |
16진수 0xffffffff의 값 (signed and unsigned) (0) | 2010.06.06 |
형식 지정자 (0) | 2010.06.06 |
상수의 표기 (0) | 2010.06.06 |
#include <stdio.h> int main() { int inum; inum = 0xffffffff; printf("%8s %8s %10s\n", "hexa", "type", "decimal"); printf("%8x : %8s %10d\n", inum, "signed", inum); printf("%8x : %8s %10u\n", inum, "unsigned", inum); return 0; } |
RESULT------------------------------------------------------------------------------------------------------------- hexa type decimal ffffffff : signed -1 ffffffff : unsigned 4294967295 RESULT------------------------------------------------------------------------------------------------------------- |
'C' 카테고리의 다른 글
버블 정렬 c 0609 (0) | 2010.06.09 |
---|---|
다중포인터 (0) | 2010.06.08 |
형식 지정자 (0) | 2010.06.06 |
상수의 표기 (0) | 2010.06.06 |
sizeof 연산자를 이용한 Data Type 크기 확인 (0) | 2010.06.06 |
printf() | scanf() | 형식 |
%c | %c | 단일 문자 |
%s | %s | 문자열 |
%d | %d | 부호있는 정수 |
%i | 부호있는 정수 | |
%i | 10진수, 8진수, 16진수 | |
%f | %f | 실수 (십진 표기) |
%e | %e | 실수 (지수 표기) |
%g | 실수 | |
%u | %u | 부호없는 정수 |
%x | %x | 부호없는 16진수 |
%o | %o | 부호없는 8진수 |
%p | 16진수 메모리 주소 |
printf() | 형식 | |
%ld | long int | |
%hd | short int | |
%lo | long int 8진수 | |
%lx | long int 16진수 | |
%u | unsigned int | |
%lu | unsigned long int | |
%lf | double | |
%Lf | long double |
'C' 카테고리의 다른 글
다중포인터 (0) | 2010.06.08 |
---|---|
16진수 0xffffffff의 값 (signed and unsigned) (0) | 2010.06.06 |
상수의 표기 (0) | 2010.06.06 |
sizeof 연산자를 이용한 Data Type 크기 확인 (0) | 2010.06.06 |
Data type 사이의 대입 및 출력 형식 (0) | 2010.06.05 |