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

개념 : 


포인터를 저장하는 배열



목표 : 


배열을 선언해보고 사용해봅니다.



소스코드 : main.c

#include <stdio.h>


int main(void)

{

char *pStirng1 = "Hello All \n";

char *pString2 = "My name is Junmo \n";

char *pString3 = "Nice to meet you \n";


int count = 0;


char *pStringSet[3] = { pStirng1, pString2, pString3 };


for (count = 0; count < 3;count++)

{

printf("%s", pStringSet[count]);

}


return 0;

}



결과 : 



#c언어, #c언어입문, #프로그램입문, #배열포인터


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

101 구조체(struct)  (0) 2017.08.07
100 다차원 배열  (0) 2017.08.04
098 Call by Reference & Call by Value  (0) 2017.08.04
097 포인터 개념  (0) 2017.08.04
096 memset  (0) 2017.08.04
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


call by reference : 참조 형태로 주소값을 부르는 형태를 일컫습니다. 정확하고 명료하게는 call by address라고도 합니다.


이것을 명확히 구분하자는 분도 있고 그냥 한꺼번에 call by reference 로 부르자는 분들이 존재 합니다 ..


저의 입장은 그냥 중립입니다. 무엇이 되었든 상황에 맞게 사용하고 부르는 것이 맞아요.




call by value : 순수 값에 의한 참조를 뜻합니다.


이둘의 차이점은 수정되었을시 원본에 대한 영향력이 있다 없다로 구분 습니다.

 



소스코드 : main.c

#include <stdio.h>


void CallByReference(int *pReference, int nCanged);

void CallByValue(int nValue, int nCanged);


int main(void)

{

int value1 = 3;

int value2 = 13;


printf("source1 : %d\n", value1);

printf("source2 : %d\n", value2);


CallByReference(&value1, 8);

CallByValue(value2, 1000);



printf("source1 : %d\n", value1);

printf("source2 : %d\n", value2);

return 0;

}


void CallByReference(int *pReference, int nCanged)

{

puts("Call By Reference");

*pReference = nCanged;

printf("Dest : %d\n", *pReference);

}


void CallByValue(int nValue, int nChanged)

{

puts("Call By Value");

nValue = nChanged;

printf("Dest : %d\n", nValue);

}



결과



 #c언어, #c언어입문, #프로그램입문, #CallByReference,#callByValue,#포인터개념

 

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

100 다차원 배열  (0) 2017.08.04
099 포인터 배열  (0) 2017.08.04
097 포인터 개념  (0) 2017.08.04
096 memset  (0) 2017.08.04
095 memmove_s  (0) 2017.07.28
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언어입문, #프로그램입문, #비교연산자안쓰고비교하기


+ Recent posts