728x90

배열의 이름은 포인터이다.

int형 배열의 주소값 차는 4바이트이며, 주소값의 변경은 불가능하다. (값을 바꿀 수 없는 상수형)


포인터 변수와 배열의 이름 모두, 메모리의 주소값을 나타내고 저장한다.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
	int arr[3] = { 0, 1, 2 };
	printf("배열의 이름: %p \n", arr);
	printf("첫번째 요소: %p \n", &arr[0]);
	printf("두번째 요소: %p \n", &arr[1]);
	printf("세번째 요소: %p \n", &arr[2]);
	// arr = &arr[i];  // 이 문장은 컴파일 에러를 일으킨다.
	return 0;
}



Output:

1
2
3
4
배열의 이름: 0xff920370 
첫번째 요소: 0xff920370 
두번째 요소: 0xff920374 
세번째 요소: 0xff920378 


 


#include <stdio.h>

int main()
{
    char *cpStr="hello world \n";
    
  char caStr[20];
    printf("Hello world \n");
    printf(cpStr);

    caStr[0]='h';
    caStr[1]='e';
    caStr[2]='l';
    caStr[3]='l';
    caStr[4]='0';

    printf(caStr);
    putchar('\n');
    return 0;

}

castr의 배열에 저장된값 출력 배열의 경우 마지막에 null을 넣지 않으면 특수문자 \0 이 자동으로 붙음 그래서 castr[4]는 0을 넣음



임베디드

7F 45 4C // ELF파일임을 나타내는 아스키 코드







#include <stdio.h>

 int main(void) 
{
     char str1[] = "My String";
     char *str2 = "Your String";
     printf("%s %s \n", str1, str2);
     printf("str1 address : %p \n", str1);

     printf("main address", main);
     printf("str address", str2);

     printf("str2 address : %p \n", str2);
     str2 = "Our String";
     printf("%s %s \n", str1, str2);

     str1[0] = 'X';
     //str2[0] = 'X';
     printf("%s %s \n", str1, str2);
	    
     return 0;	
}




단순하게 화면을 출력할꺼면 포인터를 쓰는 것이 좋다.   // char *str2 = "";

위의 예제에서 포인터는 stack 영역에서 4byte를 차지하고 문자열은 10바이트를 차지한다. (M/y/_/S/t/r/i/n/g/null)



문자를 수정하려면 문자열을 쓴다.  // char str1[] = "";


메모리의 code영역은 Read only라 쓰면 안됨. (위의 소스에서 18행을 주석처리한 이유)

도스에서 허용하지만 리눅스에선 안되며 원래 쓰지 않는 것이 맞다.





포인터를 활용한 printf문

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(void)
{
	char *cpStr = "A=%d \n";
	int A = 100;
	printf(cpStr, A);
	return 0;
}



Output:

1
A=100 



+ Recent posts