programing

C 프로그래밍에서의 보이드 포인터의 개념

prostudy 2022. 6. 17. 21:40
반응형

C 프로그래밍에서의 보이드 포인터의 개념

C 프로그래밍 언어로 타이프 캐스팅 없이 보이드 포인터를 참조 해제할 수 있습니까?

또, 포인터를 수신해 보이드 포인터에 격납할 수 있는 기능을 일반화해, 그 보이드 포인터를 이용해 일반화 기능을 만들 수 있는 방법은 없는가.

예:

void abc(void *a, int b)
{
   if(b==1)
      printf("%d",*(int*)a);     // If integer pointer is received
   else if(b==2)
      printf("%c",*(char*)a);     // If character pointer is received
   else if(b==3)
      printf("%f",*(float*)a);     // If float pointer is received
}

if-else 문을 사용하지 않고 이 함수를 범용으로 만들고 싶은데 가능한가요?

또한 보이드 포인터의 개념을 설명하는 좋은 인터넷 기사가 있다면 URL을 제공해 주시면 감사하겠습니다.

또한 void pointer를 사용한 포인터 연산이 가능한가요?

C 프로그래밍 언어로 타이프 캐스팅 없이 보이드 포인터를 참조 해제할 수 있습니까?

아니, 아니요.void거나 맡긴다고 역 참조할 수 있는 형식의 부재는지는 없다.유형이 없음을 나타냅니다.참조를 해제하거나 할당할수 없습니다.

포인터를 수신하여 보이드 포인터에 저장할 수 있는 함수를 일반화할 수 있는 방법이 있습니까? 그리고 그 보이드 포인터를 사용함으로써 일반화된 함수를 만들 수 있습니다.

제대로 정렬되지 않을 수 있으므로 휴대용 방식으로만 참조 해제할 수 없습니다.ARM과 같은 아키텍처에서는 데이터 타입에 대한 포인터가 데이터 타입의 사이즈 경계에 위치해야 하는 경우가 있습니다(32비트 정수에 대한 포인터는 참조를 해제하려면 4바이트 경계에 위치해야 합니다).

예를 들어, 독서 예를 들어, 읽기uint16_t부터에서void*::

/* may receive wrong value if ptr is not 2-byte aligned */
uint16_t value = *(uint16_t*)ptr;
/* portable way of reading a little-endian value */
uint16_t value = *(uint8_t*)ptr
                | ((*((uint8_t*)ptr+1))<<8);

또한 void 포인터를 사용한 포인터 산술이 가능합니까?

Pointer인 산술포인터 산술은의 포인터사용할 수 없습니다 포인터에서는 다음에 가능하지 않다.void콘크리트 값의 포인터를 아래에 부족 그리고 이제는 그 크기 때문에.포인터 아래에 구체적인 값이 없기 때문에 크기가 작아집니다.

void* p = ...
void *p2 = p + 1; /* what exactly is the size of void?? */

C라는 C에서 a는에서.void *의 포인터로 다른 형식의 개체에 대한 노골적인 출연진 없이:변환할 수 있습니다.명시적 캐스트 없이 다른 유형의 객체에 대한 포인터로 변환할 수 있습니다.

void abc(void *a, int b)
{
    int *test = a;
    /* ... */

그러나 이것은 함수를 보다 일반적인 방법으로 쓰는 데 도움이 되지 않습니다.

당신은 참조를 해제할 수 없습니다를 역 참조할 수 없다.void *다른 포인터 형식에 대한 포인터 역 참조로 바꾼다는 점이pointed-to 개체의 값을 얻고 있습니다.포인터를 다른 포인터 타입으로 변환하면 포인터가 포인터 오브젝트의 값을 얻을 수 있습니다.void 때문에, 「」의 를 해제해 주세요.void *아아아아아아아아아아아아아아아아아아아아.

포인터 .sizeof뾰족한 물체다시 한 번 말씀드리지만void는 진정한이 아닙니다.「 」sizeof(void)가 없기 에 포인터 하지 않습니다.void *에서는 (에 하는 포인터 하여 사용할 수 char *

지금까지 보이드 포인터에 대한 저의 절제된 설명은 다음과 같습니다.

키워드 void를 사용하여 포인터 변수를 선언하면 범용 포인터 변수가 됩니다.모든 데이터 유형(char, int, float 등)의 변수 주소를 void 포인터 변수에 할당할 수 있습니다.

main()
{
    int *p;

    void *vp;

    vp=p;
} 

void pointer에는 다른 데이터형 포인터를 할당할 수 있기 때문에 absolut_value(아래 코드) 함수로 사용했습니다.일반적인 기능을 만들기 위해.

나는 정수를 취하거나 인수로 부동하는 간단한 C 코드를 쓰려고 했고, 음수일 경우 +ve로 하려고 했다.나는 다음과 같은 코드를 작성했다.

#include<stdio.h>

void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.
{
    if ( *j < 0 )
        *j = *j * (-1);

}

int main()
{
    int i = 40;
    float f = -40;
    printf("print intiger i = %d \n",i);
    printf("print float f = %f \n",f);
    absolute_value(&i);
    absolute_value(&f);
    printf("print intiger i = %d \n",i);
    printf("print float f = %f \n",f);
    return 0;
}   

하지만 오류가 발생하여 void pointer에 대한 이해가 틀렸음을 알게 되었습니다. :(그래서 이번에는 왜 그런지 포인트 수집으로 넘어가겠습니다.

보이드 포인터에 대해 내가 더 이해해야 할 것은 그것이다.

참조 해제하려면 보이드 포인터 변수를 타이핑해야 합니다.이는 보이드 포인터에 연관된 데이터 유형이 없기 때문입니다.컴파일러가 보이드 포인터가 가리키는 데이터의 유형을 알 수 있는(또는 추측할 수 있는) 방법은 없습니다.따라서 보이드 포인터가 가리키는 데이터를 얻기 위해 보이드 포인터 위치 내에 보관된 올바른 유형의 데이터로 타이프캐스트했습니다.

void main()

{

    int a=10;

    float b=35.75;

    void *ptr; // Declaring a void pointer

    ptr=&a; // Assigning address of integer to void pointer.

    printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.

    ptr=&b; // Assigning address of float to void pointer.

    printf("The value of float variable is= %f",*( (float*) ptr) );

}

void 포인터는 프로그래머가 최종 사용자가 입력한 데이터의 데이터 유형을 확신할 수 없는 경우에 매우 유용합니다.이 경우 프로그래머는 보이드 포인터를 사용하여 미지의 데이터 타입의 위치를 가리킬 수 있다.프로그램 설정은 사용자에게 데이터 유형을 알려달라고 요청하고 사용자가 입력한 정보에 따라 유형 캐스팅을 수행할 수 있습니다.코드 스니펫은 다음과 같습니다.

void funct(void *a, int z)
{
    if(z==1)
    printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.
    else if(z==2)
    printf("%c",*(char*)a); // Typecasting for character pointer.
    else if(z==3)
    printf("%f",*(float*)a); // Typecasting for float pointer
}

보이드 포인터에 대해 기억해야 할 또 다른 중요한 점은 – 포인터 연산은 보이드 포인터에서 수행할 수 없다는 것입니다.

void *ptr;

int a;

ptr=&a;

ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.

그래서 이제 나는 내 실수가 무엇이었는지.저도 똑같이 수정하고 있습니다.

참고 자료:

http://www.antoarts.com/void-pointers-in-c/

http://www.circuitstoday.com/void-pointers-in-c 를 참조해 주세요.

새 코드는 다음과 같습니다.


#include<stdio.h>
#define INT 1
#define FLOAT 2

void absolute_value ( void *j, int *n)
{
    if ( *n == INT) {
        if ( *((int*)j) < 0 )
            *((int*)j) = *((int*)j) * (-1);
    }
    if ( *n == FLOAT ) {
        if ( *((float*)j) < 0 )
            *((float*)j) = *((float*)j) * (-1);
    }
}


int main()
{
    int i = 0,n=0;
    float f = 0;
    printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");
    scanf("%d",&n);
    printf("\n");
    if( n == 1) {
        scanf("%d",&i);
        printf("value entered before absolute function exec = %d \n",i);
        absolute_value(&i,&n);
        printf("value entered after absolute function exec = %d \n",i);
    }
    if( n == 2) {
        scanf("%f",&f);
        printf("value entered before absolute function exec = %f \n",f);
        absolute_value(&f,&n);
        printf("value entered after absolute function exec = %f \n",f);
    }
    else
    printf("unknown entry try again\n");
    return 0;
}   

감사합니다.

나 C#과는 C' Java의 C#의 해 주십시오.void*츠키다getClass()이 정보는 어디에서도 찾을 수 없기 때문에 존재하지 않습니다.때문에 여러분이 있는 ' 명시적인 메타정보가 .int b, 또는 「」의 으로 지정합니다.printf기능 패밀리

포인터가 .void포인터 : https://www.learncpp.com/cpp-tutorial/613-void-pointers/

6.13 — 무효 포인터

void 포인터는 자신이 가리키는 개체 유형을 알 수 없으므로 직접 참조할 수 없습니다!void 포인터가 참조되기 전에 먼저 명시적으로 다른 포인터 유형에 캐스트해야 합니다.

보이드 포인터가 무엇을 가리키는지 모르면 어디에 던질지 어떻게 알죠?궁극적으로, 추적하는 것은 당신에게 달려 있습니다.

보이드 포인터 기타 셀

보이드 포인터에서는 포인터 계산을 수행할 수 없습니다.포인터 산술에서는 포인터가 오브젝트가 가리키는 크기를 알아야 하기 때문에 포인터를 적절히 증감할 수 있습니다.

가 바이트 지정 액세스가 할 때, 아토믹한(표현에 ) 으로 를 할 수 .void*에 대한 로서, "A-Byte" 입니다.uint8_t* .팅 를 캐스팅하다.void* a까지uint8_t*예를 들어 첫 번째 1/2/4/8/houp-many-you-bits 바이트를 해당 주소에서 출력할 수 있지만 다른 작업은 할 수 없습니다.

uint8_t* byte_p = (uint8_t*)p;
for (uint8_t* i = byte_p; i < byte_p + 8; i++) {
  printf("%x ",*i);
}

보이드 포인터는 연관된 데이터 유형이 없는 포인터입니다.보이드 포인터는 모든 유형의 주소를 유지할 수 있으며 모든 유형에 타이프캐스트할 수 있습니다.단, 보이드 포인터는 직접 참조할 수 없습니다.

int x = 1;
void *p1;
p1 = &x;
cout << *p1 << endl; // this will give error
cout << (int *)(*p) << endl; // this is valid

보이드 포인터는 범용 포인터라고 불리며 모든 데이터 유형의 변수를 참조할 수 있습니다.

아니, 그건 불가능해.참조된 값의 유형을 선택하십시오.

C는 정적 타입의 강력한 타입의 언어이므로 컴파일 전에 변수 유형을 결정해야 합니다.C에서 제네릭스를 에뮬레이트하려고 하면 C++를 다시 쓰려고 하므로 C++를 사용하는 것이 좋습니다.

이것은 동작하지 않습니다만, void*는 함수에 대한 일반적인 포인터를 정의하고 그것을 인수로서 다른 함수에 건네주거나(자바의 콜백과 유사), oop과 유사한 구조를 정의하는 데 많은 도움이 됩니다.

void abc(void *a, int b) {
  char *format[] = {"%d", "%c", "%f"};
  printf(format[b-1], a);
}

기본적으로 C에서 "타입"은 메모리의 바이트를 해석하는 방법입니다.예를 들어, 다음 코드

struct Point {
  int x;
  int y;
};

int main() {
  struct Point p;
  p.x = 0;
  p.y = 0;
}

"메인을 실행할 때 4(정수 크기) + 4(정수 크기) = 8(총 바이트)의 메모리를 할당하고 싶습니다.컴파일 시 Point라는 타입 라벨이 붙은 값에 .x를 l값으로 쓰면 포인터의 메모리 위치에 4바이트를 더한 데이터를 가져옵니다.반환값에 컴파일 시간 레이블 "int"를 지정합니다.""

실행 시 컴퓨터 내부의 "Point" 구조는 다음과 같습니다.

00000000 00000000 00000000 00000000 00000000 00000000 00000000

그리고 여기 네 말이 있다void*데이터 유형은 다음과 같을 수 있습니다. (32비트 시스템의 경우)

10001010 11111001 00010010 11000101

이 기능을 if를 사용하지 않고 범용으로 하고 싶은데 가능한가요?

내가 볼 수 있는 유일한 간단한 방법은 과부하를 사용하는 것이다.C 프로그래밍 언어 AFAIK에서는 사용할 수 없습니다.

사용 중인 프로그램의 C++ 프로그래밍 언어를 고려했습니까?아니면 사용을 금지하는 제약이 있나요?

보이드 프린터를 쉽게 인쇄할 수 있습니다.

int p=15;
void *q;
q=&p;
printf("%d",*((int*)q));

void 포인터는 범용 포인터입니다.void 포인터에 임의의 변수의 데이터형 주소를 할당할 수 있습니다.

int a = 10;
float b = 3.14;
void *ptr;
ptr = &a;
printf( "data is %d " , *((int *)ptr)); 
//(int *)ptr used for typecasting dereferencing as int
ptr = &b;
printf( "data is %f " , *((float *)ptr));
//(float *)ptr used for typecasting dereferencing as float

데이터 유형에 따라 메모리 크기가 다르므로 포인터의 유형을 지정하지 않고 참조를 해제할 수 없습니다. 즉, int는 4바이트, char는 1바이트입니다.

언급URL : https://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming

반응형