336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. 포인터 변수는 메모리 주소를 기록하는 공간 입니다.

2. * (애틸리스크) 를 자료형과 변수이름 사이에 넣습니다.

3. 자료형에 상관없이 포인터는 32bit 시스템에서 4Byte, 64bit 시스템에서 8Byte 공간을 차지 합니다

4. &(앤퍼센트) 는 변수 이름에 앞에 붙이면 주소값을 말합니다. 그래서 주소 연산자라고 부르기도 합니다.



소스코드 : main.c

#include <stdio.h>


int main(void)

{

char *pCharPointer = NULL;

short *pShortPointer = NULL;

long  *pLongPointer = NULL;

int *pIntPointer = NULL;

__int8 *pInt8Pointer = NULL;

__int16 *pInt16Pointer = NULL;

__int32 *pInt32Pointer = NULL;

__int64 *pInt64Pointer = NULL;

float *pFloatPointer = NULL;

double *pDoublePointer = NULL;



printf("char 의 포인터 변수의 크기 : %d Byte \n", sizeof(pCharPointer));

printf("short 의 포인터 변수의 크기 : %d Byte \n", sizeof(pShortPointer));

printf("long 의 포인터 변수의 크기 : %d Byte \n", sizeof(pLongPointer));

printf("int 의 포인터 변수의 크기 : %d Byte \n", sizeof(pIntPointer));

printf("__int8 의 포인터 변수의 크기 : %d Byte \n", sizeof(pInt8Pointer));

printf("__int16 의 포인터 변수의 크기 : %d Byte \n", sizeof(pInt16Pointer));

printf("__int32 의 포인터 변수의 크기 : %d Byte \n", sizeof(pInt32Pointer));

printf("__int64 의 포인터 변수의 크기 : %d Byte \n", sizeof(pInt64Pointer));

printf("float 의 포인터 변수의 크기 : %d Byte \n", sizeof(pFloatPointer));

printf("double 의 포인터 변수의 크기 : %d Byte \n", sizeof(pDoublePointer));

return 0;

}


결과:


1. 32bit 플랫폼




2. 64bit 플랫폼




 #c언어, #c언어입문, #프로그램입문, #포인터,#pointer,#포인터크기,#포인터개념

 


'Programing - C > C Basic grammar ' 카테고리의 다른 글

099 포인터 배열  (0) 2017.08.04
098 Call by Reference & Call by Value  (0) 2017.08.04
096 memset  (0) 2017.08.04
095 memmove_s  (0) 2017.07.28
094 memcmp 두메모리 비교  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. string.h 에 포함 되어 있습니다.


2. 메모리를 일정 값으로 체워 넣습니다. 채워질값은 아스키 코드값을 참조 해주시면됩니다.



목표 : 


실재 필드에서 주로 사용되는 초기화 예제를 만들어 보겠습니다.



소스코드 : main.c

#include <stdio.h>

#include <string.h>


void ZeroMem(void* Dest, unsigned int size);


int main(void)

{

char Buffer[256]; // 초기화 되지 않는 상태에 출력 함수에 대입하면 문제가 생깁니다.


puts(Buffer);// 얼마나 잘못됬는지를 확인 시쳐 드릴려고 일부러 해보았습니다.

//쓰레기 값중에서 0이 나올때까지 계속 출력하게됩니다.

puts("memory 초기화");


ZeroMem(Buffer, sizeof(Buffer));


puts(Buffer);//안의 값이 모두 0으로 초기화 되어 빈칸이 출력이됩니다.


strcat_s(Buffer, sizeof(Buffer), "Hello World");// 값을 넣어줍니다.


puts(Buffer);//다시 출력합니다.


return 0;

}


void ZeroMem(void* Dest, unsigned int size)

{

memset(Dest, 0, size);

}



결과


#달달한모찌이야기, #c언어, #c언어입문, #프로그램입문, #memset,#ZeroMemory구현


'Programing - C > C Basic grammar ' 카테고리의 다른 글

098 Call by Reference & Call by Value  (0) 2017.08.04
097 포인터 개념  (0) 2017.08.04
095 memmove_s  (0) 2017.07.28
094 memcmp 두메모리 비교  (0) 2017.07.28
093 memcpy_s 메모리 복사  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


memcpy_s 와 매우 흡사하나 원하는 구역을 복사해서 옴긴다는 개념입니다.


예제의 코드에서 memcpy_s 부분을  memmove_s 함수 이름을 바꿔줘도 결과는


동일합니다. 가독성에 맞게 사용하는것을 권장합니다.



소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>


int main(void)

{

char *pString = "Hello JunmoZzi";

char *pAdd = " ^^a ha ha ha!";


char *pBuffer = NULL;

int nSize1 = strlen(pString) + 1;

int nSize2 = strlen(pAdd) + 1;

pBuffer = calloc(nSize1 + 1, sizeof(char));


if (pBuffer == NULL)

{

puts("memory 할당 실패");

}

else

{

puts("memory 할당 성공");

printf("메모리 주소 : %d\n", pBuffer);

//strcpy_s(pBuffer, nSize1, pString);

memmove_s(pBuffer, nSize1, pString, nSize1);

}


puts("Run memcmp : pBuffer, pStirng");

if (memcmp(pBuffer, pString, nSize1) == 0)

{

puts("동일한 메모리");

}

else

{

puts("동일하지 않는 메모리");

}


puts(pBuffer);

puts("메모리 재 할당");


realloc(pBuffer, nSize1 + nSize2);

pBuffer[nSize1 - 1] = ' ';// 문자열의 끝 \0을 공백으로 변경


 //strcat_s(pBuffer, nSize1+nSize2, pAdd);

memmove_s(pBuffer + nSize1, nSize2, pAdd, nSize2);

printf("메모리 주소 : %d\n", pBuffer);

puts(pBuffer);


free(pBuffer);

pBuffer = NULL;

return 0;

}




결과 : 




#c언어, #c언어입문, #프로그램입문, #memmove_s

c언어, c언어입문, 프로그램입문 ,memmove_s

'Programing - C > C Basic grammar ' 카테고리의 다른 글

097 포인터 개념  (0) 2017.08.04
096 memset  (0) 2017.08.04
094 memcmp 두메모리 비교  (0) 2017.07.28
093 memcpy_s 메모리 복사  (0) 2017.07.28
092 realloc 메모리 재할당  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 :


strcmp 와 같이 비교를 합니다 대상이 메모리 데이터 자체냐 아니면 문자열이냐의 차이점을 두고있습니다. 사실 둘의 차이는 가독성에 문제이지 전혀 


다른기능을 하는 것이 없이 동일합니다.




소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>


int main(void)

{

char *pString = "Hello JunmoZzi";

char *pAdd = " ^^a ha ha ha!";


char *pBuffer = NULL;

int nSize1 = strlen(pString) + 1;

int nSize2 = strlen(pAdd) + 1;

pBuffer = calloc(nSize1 + 1, sizeof(char));


if (pBuffer == NULL)

{

puts("memory 할당 실패");

}

else

{

puts("memory 할당 성공");

printf("메모리 주소 : %d\n", pBuffer);

//strcpy_s(pBuffer, nSize1, pString);

memcpy_s(pBuffer, nSize1, pString, nSize1);

}


puts("Run memcmp : pBuffer, pStirng");

if (memcmp(pBuffer, pString, nSize1) == 0)

{

puts("동일한 메모리");//동일한 데이터

}

else

{

puts("동일하지 않는 메모리");

}


puts(pBuffer);

puts("메모리 재 할당");


realloc(pBuffer, nSize1 + nSize2);


pBuffer[nSize1 - 1] = ' ';// 문자열의 끝 \0을 공백으로 변경


 //strcat_s(pBuffer, nSize1+nSize2, pAdd);

memcpy_s(pBuffer + nSize1, nSize2, pAdd, nSize2);

printf("메모리 주소 : %d\n", pBuffer);

puts(pBuffer);


free(pBuffer);

pBuffer = NULL;

return 0;

}




결과


 #c언어, #c언어입문, #프로그램입문, #memcmp, #메모리검사, #메모리비교함수


'Programing - C > C Basic grammar ' 카테고리의 다른 글

096 memset  (0) 2017.08.04
095 memmove_s  (0) 2017.07.28
093 memcpy_s 메모리 복사  (0) 2017.07.28
092 realloc 메모리 재할당  (0) 2017.07.28
091 calloc  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념  : 


메모리 공간원 원하는 만큼 어떤 자료형이든 복사할수 있다.



목표 :


strcpy_s 와 strcat_s를 쓰지않고 memcpy_s로 대체하기



소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>


int main(void)

{

char *pString = "Hello JunmoZzi";

char *pAdd = " ^^a ha ha ha!";


char *pBuffer = NULL;

int nSize1 = strlen(pString) + 1;

int nSize2 = strlen(pAdd) + 1;

pBuffer = calloc(nSize1 + 1, sizeof(char));


if (pBuffer == NULL)

{

puts("memory 할당 실패");

}

else

{

puts("memory 할당 성공");

printf("메모리 주소 : %d\n", pBuffer);

//strcpy_s(pBuffer, nSize1, pString);

memcpy_s(pBuffer, nSize1, pString, nSize1);

}


puts(pBuffer);

puts("메모리 재 할당");


realloc(pBuffer, nSize1 + nSize2);


pBuffer[nSize1 - 1] = ' ';// 문자열의 끝 \0을 공백으로 변경


 //strcat_s(pBuffer, nSize1+nSize2, pAdd);

memcpy_s(pBuffer + nSize1, nSize2, pAdd, nSize2);

printf("메모리 주소 : %d\n", pBuffer);

puts(pBuffer);


free(pBuffer);

pBuffer = NULL;

return 0;

}




결과




#memcpy_s, #c언어, #c언어입문, #프로그램입문



'Programing - C > C Basic grammar ' 카테고리의 다른 글

095 memmove_s  (0) 2017.07.28
094 memcmp 두메모리 비교  (0) 2017.07.28
092 realloc 메모리 재할당  (0) 2017.07.28
091 calloc  (0) 2017.07.28
take rest 03 == 비교 연산자를 쓰지 않는 함수를 만들어보기  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


malloc 이나 calloc 된 공간을 재 할당  할때 사용합니다.




소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>


int main(void)

{

char *pString = "Hello JunmoZzi";

char *pAdd = " ^^a ha ha ha!";


char *pBuffer = NULL;

int nSize1 = strlen(pString) + 1;

int nSize2 = strlen(pAdd) + 1;

pBuffer = calloc(nSize1 + 1, sizeof(char));


if (pBuffer == NULL)

{

puts("memory 할당 실패");

}

else

{

puts("memory 할당 성공");

printf("메모리 주소 : %d\n", pBuffer);

strcpy_s(pBuffer, nSize1, pString);

}


puts(pBuffer);

puts("메모리 재 할당");


realloc(pBuffer, nSize1 + nSize2);


strcat_s(pBuffer, nSize1 + nSize2, pAdd);

printf("메모리 주소 : %d\n", pBuffer);

puts(pBuffer);


free(pBuffer);

pBuffer = NULL;

return 0;

}



결과



#realloc,#c언어, #c언어입문, #프로그램입문, #realloc, #메모리재할당


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
개념 : 

malloc 과 같은 메모리를 할당하는 함수이지만 할당한 공간을 초기화 해준다.



소스코드 : main.c

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main(void)
{
char *pString = "Hello JunmoZzi";
char *pBuffer = NULL;
pBuffer = calloc(strlen(pString) + 1, sizeof(char));

if (pBuffer == NULL)
{
puts("memory 할당 실패");
}
else
{
puts("memory 할당 성공");
strcpy_s(pBuffer, strlen(pString) + 1, pString);
}

puts(pBuffer);

free(pBuffer);
pBuffer = NULL;
return 0;
}


결과


#c언어, #c언어입문, #프로그램입문, #calloc


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
목표 )

비교 연산자를 쓰지 않고 두정수의 같은지 여부를 판별하는 함수를 만들어 본다.


소스 코드 : main.c

#include <stdio.h>


int compare(int source, int dest);


int main(void)

{

int value1 = 1;

int value2 = 2;

int value3 = 1;


int result1 = compare(value1, value2);

int result2 = compare(value1, value3);;


if (result1)

{

printf("value1 과 value2 값은 같습니다. %d \n", result1);

}

else

{

printf("value1 과 value2 값은 같지 않습니다. %d \n", result1);

}



if (result2)

{

printf("value1 과 value3 값은 같습니다. %d \n", result2);

}

else

{

printf("value1 과 value3 값은 같지 않습니다. %d \n", result2);

}


return 0;

}


int compare(int source, int dest)

{

return !(source - dest);// !(source ^ dest) xor 두비트가 같을때만 0을 리턴

}


결과1



이 코드는 비교연산을 사용하지 않습니다.


산술연산자와 비트 연산자 그리고 논리연산자 조합으로 만들어 젔습니다.

효율성윽 그닥 좋지 않습니다.

그래도 만들었으니 설명을 해보면 정수는 간단하게 자기 자신을 빼주면 0이 됩니다.

여기에 논리 연산자를 적용해서 0이면 1로 바꿔줍니다.

그리고 어떤한 값이 들어가게 되면 논리 연산자 NOT은 0으로 바꿔버리는 연산법칙이 있는 점을 이용하여

만들었습니다 . 조금더 발전 시키면!! !(source ^ dest을 사용하셔도 똑같은결과를 얻습니다!!

시스템 적으로 어떻게 좋을가요!!?! 당연 !(source ^ dest효율적인 연산 속도를 얻을 수있어요 

소스코드를 조금 수정하여



소스 코드 : main2.c

#include <stdio.h>

#include <windows.h>


#define MAX 100000000


int compare1(int source, int dest);

int compare2(int source, int dest);


int main(void)

{

int result1 = 0;


int value1 = 0;

int value2 = 0;


unsigned int time1 = 0;

unsigned int time2 = 0;

unsigned int time3 = 0;


int result2 = 0;


int count1 = 0;


time1 = GetTickCount();

while (count1 < MAX)

{

result1 = compare1(value1, value2);

count1++;

}


time1 = GetTickCount() - time1;


count1 = 0;


time2 = GetTickCount();


while (count1 < MAX)

{

result1 = compare2(value1, value2);

count1++;

}


time2 = GetTickCount() - time2;


count1 = 0;


time3 = GetTickCount();


while (count1 < MAX)

{

result2 = (value1 == value2);

count1++;

}


time3 = GetTickCount() - time3;


printf("compare1 : %d \n", time1);

printf("compare2 : %d \n", time2);

printf(" ==  : %d \n", time3);



return 0;

}


int compare1(int source, int dest)

{

return !(source ^ dest);

}


int compare2(int source, int dest)

{

return !(source - dest);

}



결과2



퍼포먼스차이가 분명있습니다.


그냥 비교연산자 쓰는것이 빠릅니다.


또다른 실험으로 ^ 만 사용하면  == 보다는 빠릅니다.

하지만 !을 붙이면 퍼포먼스가 같게 나옵니다.

대입 연산자를 못쓰는 상황에서

두수를 비교할때 가장 근접한 퍼포먼스를 보이는 방법은

!(value1 ^ value2) 을 해주면 된다로 결론이 나옵니다.

즉 (value1 == value2)와 거의 같은 수준의 퍼포먼스를 보입니다.

자세한 내막은 컴파일러만이 아는걸로 ~


#c언어, #c언어입문, #프로그램입문, #비교연산자안쓰고비교하기


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. malloc.h 에 포함되어 있습니다.


2. memory allocation 의 약자 입니다.


3. 힙 영역에 메모리를 할당하는 함수 입니다.


4. 리턴된 값은 void 포인터이고 파라메터값은 정수 형태의 할당할 크기 입니다.

(나중에 void 포인터에 대해서 이야기 할 것 이지만 지금은 그냥 사용을 위해서는 반드시 캐스팅을 해야 한다로만 정의하고 넘어가도록 하겠습니다.)



목표:

문자열의 크기 만큼을 할당하고 문자열을 카피 한다.




소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>

int main(void)

{

unsigned char* pString = "Hello JunmoZzi";

unsigned char* pBuffer = NULL;

int nLength = strlen((const char*)pString) + 1;// "\0"문자 널까지 포함해서 1 입니다.

pBuffer = (unsigned char*)malloc(nLength);


if (pBuffer == NULL)

{

puts("Failed Memory Allocation!");

return 0;

}


memcpy_s(pBuffer, nLength, pString, nLength);


puts(pString);

puts(pBuffer);


if (pBuffer)

{

free(pBuffer);//메모리 할당했으면 반드시 해제 해준다.

}

return 0;

}



결과



#c언어, #c언어입문, #프로그램입문, #malloc, #메모리동적할당


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

메모리 영역에 대한 이해가 필요한 이유 


예전 하드웨어에는 턱없이 적은양의 메모리로 구동되었습니다.


그러기 때문에 메모리를 효율적으로 관리 하기 위해서는 영역을 나눠서 관리 할 필요가 있었고,


현재는 메모리 자체가 기가 단위로 되어서 메모리 관리 안해도 되지 않겠냐는 생각도 할 수 있겠지만


그래도 메모리는 무한한 영역이 아니라는 관점에서 관리의 대상이 되는 것은 변함 없습니다.






코드 영역:


사용자에 의해서 작성된 코드가 저장되는 영역입니다.



데이터 영역 :


전역변수와 상수 값이 저장되는 영역입니다.



힙 영역 :


사용자에 의해서 동적으로 할당된 영역입니다.



스택 영역 :


지역변수등 나머지 영역이 할당되는 영역입니다.




힙 영역을 제외하곤 나머지는 컴파일러가 알아서 관리 합니다.

 



#메모리영역,  #c언어입문, #c언어, #프로그램입문



+ Recent posts