সি প্রোগ্রামিংয়ে শূন্য পয়েন্টার ধারণা


129

সি প্রোগ্রামিং ভাষায় টাইপ-কাস্টিং ছাড়াই কি কোনও শূন্য পয়েন্টারকে অবজ্ঞা করা সম্ভব?

এছাড়াও, কোনও ফাংশনকে সাধারণ করার কোনও উপায় আছে যা একটি পয়েন্টার গ্রহণ করতে পারে এবং এটি একটি শূন্য পয়েন্টারটিতে সঞ্চয় করতে পারে এবং সেই শূন্য পয়েন্টারটি ব্যবহার করে, আমরা কী সাধারণকরণ করতে পারি?

যেমন:

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
}

আমি যদি অন্য বিবৃতি ব্যবহার না করে এই ফাংশনটিকে জেনেরিক করতে চাই - এটি কি সম্ভব?

এছাড়াও যদি এমন কোনও ভাল ইন্টারনেট নিবন্ধ থাকে যা শূন্য পয়েন্টারটির ধারণাটি ব্যাখ্যা করে তবে আপনি ইউআরএল সরবরাহ করতে পারলে এটি উপকারী হবে।

এছাড়াও, অকার্যকর পয়েন্টার সহ পয়েন্টার গাণিতিক কি সম্ভব?

উত্তর:


97

সি প্রোগ্রামিং ভাষায় টাইপ-কাস্টিং ছাড়াই কি অকার্যকর পয়েন্টারটিকে অবজ্ঞা করা সম্ভব ...

না, voidপ্রকারের অনুপস্থিতি নির্দেশ করে, এটি এমন কিছু নয় যা আপনি অবলম্বন করতে পারেন বা নির্ধারণ করতে পারেন।

কোনও ফাংশনকে সাধারণ করার কোনও উপায় আছে যা পয়েন্টার গ্রহণ করতে পারে এবং এটি শূন্য পয়েন্টারে সঞ্চয় করতে পারে এবং সেই শূন্য পয়েন্টারটি ব্যবহার করে আমরা একটি সাধারণকরণ করতে পারি ..

আপনি এটি কেবল পোর্টেবল উপায়ে ডিরিফারেন্স করতে পারবেন না, কারণ এটি সঠিকভাবে সংযুক্ত নাও হতে পারে। এটি এআরএম এর মতো কিছু আর্কিটেকচারের ক্ষেত্রে সমস্যা হতে পারে, যেখানে ডেটা টাইপের পয়েন্টারটি ডাটা টাইপের আকারের সীমানায় প্রান্তিক করা আবশ্যক (উদাহরণস্বরূপ 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নীচে কংক্রিট মান না থাকায় এবং এর ফলে আকারের কারণে পয়েন্টার গাণিতিকগুলি পয়েন্টারগুলিতে সম্ভব নয় ।

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

2
আমি যদি ভুলভাবে স্মরণ না করি তবে আপনি দুটি উপায়ে নিরাপদে কোনও শূন্য *কে অবজ্ঞা করতে পারেন। চর * এ ingালাই সর্বদা গ্রহণযোগ্য এবং আপনি যদি মূল টাইপটি জানেন তবে এটি আপনাকে নির্দেশ করে that ধরণের cast শূন্য * টাইপ তথ্যটি হারিয়ে গেছে তাই এটি অন্য কোথাও সংরক্ষণ করতে হবে।
ড্যান ওলসন

1
হ্যাঁ, আপনি সবসময় আপনি আরেক ধরনের মধ্যে নিক্ষেপ ডি-রেফারেন্স করতে পারেন, কিন্তু আপনি একই যদি আপনি ব্যবহার করতে পারবেন না না নির্বাচিত করেন। সংক্ষেপে, সংকলক জেনে যাবে না যে আপনি গণনা পরিচালনা না করার আগ পর্যন্ত গণিত ক্রিয়াকলাপগুলির জন্য কী সমাবেশ নির্দেশাবলী ব্যবহার করবেন ।
জাচারি হাম হাম

20
আমি মনে করি জিসিসি void *পয়েন্টারগুলিতে পাটিগণিতের সাথে একই রকম আচরণ করে char *তবে এটি মানসম্মত নয় এবং আপনার উপর নির্ভর করা উচিত নয়।
প্রচারিত

5
আমি নিশ্চিত না যে আমি অনুসরণ করি। উদাহরণস্বরূপ যে আগত ইনকামিং প্রকারের উপরে তালিকাবদ্ধ রয়েছে তা ফাংশনের ব্যবহারকারীর দ্বারা সঠিক হওয়ার গ্যারান্টিযুক্ত। আপনি কি বলছেন যে আমাদের যদি এমন কিছু থাকে যেখানে আমরা একটি পয়েন্টারের কাছে পরিচিত প্রকারের মান নির্ধারণ করি, এটি একটি শূন্য পয়েন্টারটিতে কাস্ট করে এবং তারপরে এটি আবার মূল পয়েন্টার টাইপের কাছে ফেলে দেয় যে এটি স্বাক্ষরবিহীন হয়ে যেতে পারে? আমি বুঝতে পারছি না যে সংকলকটি আপনাকে কেন এলোমেলোভাবে কেবল এলোমেলো জিনিসগুলিকে পছন্দ করে দেয় কারণ আপনি এগুলি একটি অকার্যকর পয়েন্টারে ফেলে দেন। বা আপনি কি কেবল বলছেন যে আমরা ব্যবহারকারীর পক্ষে আস্থার যে প্রকারটি তারা ফাংশনে গিয়েছিল তা জানতে বিশ্বাস করতে পারি না?
ডলাইভার

2
@ ডোলিভার বলতে আমি বোঝাতে চাইছি # 2 ("আমরা ফাংশনে যে যুক্তিগুলি দিয়েছি সেগুলি জানার জন্য আমরা ব্যবহারকারীকে বিশ্বাস করতে পারি না")। তবে 6 বছর আগে আমার উত্তরটি পুনর্বিবেচনা করে (উঘ, এটি কি এত দীর্ঘ হয়েছে?) আপনি কী বলতে চাইছেন তা আমি দেখতে পাচ্ছি, এটি সবসময় হয় না: যখন মূল পয়েন্টারটি সঠিক প্রকারের দিকে ইঙ্গিত করে তখন এটি ইতিমধ্যে সংযুক্ত থাকে, তাই এটি প্রান্তিককরণের সমস্যাগুলি ছাড়াই কাস্ট করা নিরাপদ।
অ্যালেক্স বি

31

সি-তে, একটি void *স্পষ্টরূপে castালাই ছাড়াই একটি ভিন্ন ধরণের একটি অবজেক্টে পয়েন্টারে রূপান্তরিত হতে পারে:

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

যদিও এটি আপনার ফাংশনটিকে আরও সাধারণ উপায়ে লেখার ক্ষেত্রে সহায়তা করে না।

void *পয়েন্টারকে ডিফারেন্সিং করে পয়েন্টার-অবজেক্টের মান অর্জন করার কারণে আপনি এটিকে অন্য পয়েন্টার ধরণের রূপান্তরিত করে ডি-রেফারেন্স করতে পারবেন না । একটি নগ্ন voidএকটি বৈধ প্রকার নয় তাই একটি ডিফেন্সিং void *সম্ভব নয়।

পয়েন্টার গাণিতিক হ'ল পয়েন্টার sizeof-টু অবজেক্টের গুণমান দ্বারা পয়েন্টার মান পরিবর্তন করা । আবার, কারণ voidএটি একটি সত্য ধরণের নয়, sizeof(void)এর অর্থ নেই তাই পয়েন্টার গাণিতিকটি বৈধ নয় void *। (কিছু বাস্তবায়ন এটির জন্য সমান পয়েন্টার গাণিতিক ব্যবহার করে অনুমতি দেয় char *))


1
@ চার্লসবাইলি আপনার কোডটিতে আপনি লিখেন void abc(void *a, int b)। তবে কেন ব্যবহার করবেন না void abc(int *a, int b), যেহেতু আপনার ফাংশনে আপনি শেষ পর্যন্ত সংজ্ঞা দেবেন int *test = a;, এটি একটি ভেরিয়েবলকে বাঁচাতে পারে এবং আমি অন্য ভেরিয়েবলের সংজ্ঞা দিয়ে অন্য কোনও সুবিধা দেখতে পাচ্ছি না। আমি void *প্যারামিটার হিসাবে এইভাবে অনেক কোড রাইটেন দেখছি এবং পরে ফাংশনে ভেরিয়েবল ingালাই করছি । তবে যেহেতু এই ফান্ট লেখক লিখেছেন তাই তাকে অবশ্যই ভেরিয়েবলের ব্যবহার জানতে হবে, সুতরাং কেন ব্যবহার করবেন void *? ধন্যবাদ
সিংহ লাই

15

আপনার সচেতন হওয়া উচিত যে সি তে, জাভা বা সি # এর বিপরীতে, void*পয়েন্টারটি পয়েন্টারটি কীভাবে নির্ধারণ করে সেটির ধরণের সাফল্যের সাথে "অনুমান" করার কোনও সম্ভাবনা নেই । সাদৃশ্যযুক্ত কিছু getClass()উপস্থিত নেই, কারণ এই তথ্য কোথাও পাওয়া যায়নি। সেই কারণে, আপনি যে ধরণের "জেনেরিক" সন্ধান করছেন সর্বদা স্পষ্টভাবে বিনোদনের সাথে আসে int bযেমন আপনার উদাহরণে বা printfফাংশনের পরিবারে ফর্ম্যাট স্ট্রিংয়ের মতো ।


7

একটি অকার্যকর পয়েন্টার জেনেরিক পয়েন্টার হিসাবে পরিচিত, যা কোনও ডাটা টাইপের ভেরিয়েবলগুলি উল্লেখ করতে পারে।


6

এখন পর্যন্ত অকার্যকর পয়েন্টারটিতে আমার নিম্নরূপ দেওয়া হচ্ছে follows

যখন কোনও পয়েন্টার ভেরিয়েবল কীওয়ার্ড অকার্যকরভাবে ঘোষণা করা হয় - এটি একটি সাধারণ উদ্দেশ্য পয়েন্টার ভেরিয়েবল হয়ে যায়। যে কোনও ডেটা টাইপের যেকোন ভেরিয়েবলের ঠিকানা (চর, ইনট, ফ্লোট ইত্যাদি) একটি অকার্যকর পয়েন্টার ভেরিয়েবলের জন্য বরাদ্দ করা যেতে পারে।

main()
{
    int *p;

    void *vp;

    vp=p;
} 

যেহেতু অন্যান্য ডেটা টাইপ পয়েন্টারকে অকার্যকর পয়েন্টার নির্ধারিত করা যেতে পারে, তাই আমি এটিকে absolut_value (নীচে দেখানো কোড) ফাংশনে ব্যবহার করেছি। একটি সাধারণ কাজ করতে।

আমি একটি সাধারণ সি কোড লেখার চেষ্টা করেছি যা আর্গুমেন্ট হিসাবে পূর্ণসংখ্যা বা ভাসমান এবং নেতিবাচক হলে এটি + 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 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) );

}

যদি প্রোগ্রামার শেষ ব্যবহারকারীর দ্বারা ইনপুট করা ডেটা জাতীয় ডেটা সম্পর্কে নিশ্চিত না হয় তবে একটি শূন্য পয়েন্টারটি সত্যই কার্যকর হতে পারে। এই জাতীয় ক্ষেত্রে প্রোগ্রামার অজানা তথ্য টাইপের অবস্থানের দিকে নির্দেশ করতে একটি শূন্য পয়েন্টার ব্যবহার করতে পারে। প্রোগ্রামটি এমনভাবে সেট করা যেতে পারে যে ব্যবহারকারীকে ডেটা এবং টাইপ কাস্টিং ব্যবহারের ধরণটি ব্যবহারকারীকে ইনপুট করা তথ্য অনুযায়ী সম্পাদন করা যেতে পারে inform নীচে একটি কোড স্নিপেট দেওয়া হয়েছে।

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;
}   

ধন্যবাদ,


2

না, এটা সম্ভব নয়। সম্মানিত মানটি কী ধরণের হওয়া উচিত?


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

এই প্রোগ্রামটি কি সম্ভব .... দয়া করে পরীক্ষা করে দেখুন, সি প্রোগ্রামিংয়ে যদি এটি সম্ভব হয় ...
এজিক

2
হ্যাঁ, এটি সম্ভব (যদিও কোডটি বি এর জন্য বিস্তৃত চেক ছাড়াই বিপজ্জনক)। প্রিন্টফ একটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট গ্রহণ করে এবং এটিকে কোনও পয়েন্টার হিসাবে স্ট্যাকের উপরে চাপ দেওয়া হয় (কোনও ধরণের তথ্য ছাড়াই) এবং ফর্ম্যাট স্ট্রিংয়ের তথ্য ব্যবহার করে ভায়ারগ ম্যাক্রো ব্যবহার করে প্রিন্টফ ফাংশনের ভিতরে পপ করা হয়।
hlovdal

@ সিজেএক্স: দয়া করে বর্ণনা করুন যেটি বহনযোগ্য নয় এবং কোনটি সংজ্ঞায়িত হতে পারে।
গৌথিয়ার

@ গৌথিয়ার একটি ভেরিয়েবল পাস করছে যার মধ্যে ফর্ম্যাট স্পেসিফায়ার রয়েছে এটি বহনযোগ্য এবং সম্ভাব্য অপরিজ্ঞাত আচরণ নয়। আপনি যদি এরকম কিছু করতে চান তবে 'বনাম' এর স্বাদটি দেখুন printfএই উত্তরটির জন্য এটি একটি ভাল উদাহরণ রয়েছে।
সিজেক্সএক্স

অনুশীলনে, আমি সম্ভবত int bএকটি এনাম দিয়ে প্রতিস্থাপন করব , তবে পরে সেই এনামে কোনও পরিবর্তন করা এই ফাংশনটি ভেঙে দেবে।
জ্যাক স্টাউট

1

আমি ifs ব্যবহার না করে এই ফাংশনটিকে জেনেরিক করতে চাই; এটা কি সম্ভব?

আমি দেখতে পাচ্ছি একমাত্র সহজ উপায় হ'ল ওভারলোডিং ব্যবহার করা .. যা সি প্রোগ্রামিংয়ের ল্যাঙ্গেজ এএফআইএকে উপলভ্য নয়।

আপনি কি আপনার প্রোগ্রামের জন্য সি ++ প্রোগ্রামিং ল্যাঙ্গেজ বিবেচনা করেছেন? বা এমন কোনও বাধা আছে যা এর ব্যবহার নিষিদ্ধ করে?


ঠিক আছে, এটা লজ্জাজনক। আমার দৃষ্টিকোণ থেকে আমি তখন কোনও সমাধান দেখতে পাচ্ছি না। প্রকৃতপক্ষে, এটি প্রিন্টফ () এবং কাউট: মুদ্রণ বাস্তবায়নের 2 বিভিন্ন উপায়ের মতো। printf () if () স্টেটমেন্টটি ফর্ম্যাট স্ট্রিংটি ডিকোড করার জন্য ব্যবহার করুন (আমি মনে করি বা অনুরূপ কিছু), যখন cout কেস অপারেটরের জন্য << একটি ওভারলোডেড ফাংশন
yves বাউমস

1

এখানে পয়েন্টারে একটি সংক্ষিপ্ত পয়েন্টার রয়েছে void: https://www.learncpp.com/cpp-tutorial/613-void-pointers/

6.13 - অকার্যকর পয়েন্টার

কারণ অকার্যকর পয়েন্টারটি জানেন না যে এটি কী ধরণের বস্তুর দিকে ইশারা করছে, তাই এটি সরাসরি অবচয় করা যায় না! বরং শূন্য পয়েন্টারটি প্রথমে স্পষ্টভাবে অন্য পয়েন্টার টাইপটিকে নির্দিষ্ট করে দেওয়ার আগে অবশ্যই স্পষ্টভাবে কাস্ট করা উচিত।

যদি কোনও শূন্য পয়েন্টার এটি কীসের দিকে ইঙ্গিত করছে তা যদি না জানে, তবে কীভাবে এটি নিক্ষেপ করতে হবে তা আমরা কীভাবে জানব? শেষ পর্যন্ত, এটি আপনার উপর নির্ভর করে ট্র্যাক রাখা।

অকার্যকর পয়েন্টার বিবিধ

অকার্যকর পয়েন্টারটিতে পয়েন্টার গাণিতিক কাজ করা সম্ভব নয়। এটি কারণ পয়েন্টার গাণিতিকটির জন্য পয়েন্টারটি জানতে প্রয়োজন যে এটি কোন আকারের বস্তুটির দিকে নির্দেশ করছে তাই এটি পয়েন্টারটিকে যথাযথভাবে বৃদ্ধি বা হ্রাস করতে পারে।

ধরে নিই যে মেশিনের মেমরিটি বাইট-এড্রেসযোগ্য এবং প্রান্তিককরণের অ্যাক্সেসের প্রয়োজন হয় না, সর্বাধিক জেনেরিক এবং পারমাণবিক (মেশিন স্তরের প্রতিনিধিত্বের নিকটতম) উপায়টির অর্থ void*পয়েন্টার-টু-এ-বাইট uint8_t*,। একটিতে কাস্ট করা void*আপনাকে uint8_t*উদাহরণস্বরূপ, প্রথম ঠিকানাটি শুরু করে প্রথম 1/2/4/8 / তবে-আপনি-ইচ্ছা-বাইটগুলি প্রিন্ট করে ফেলতে পারবেন, তবে আপনি আর কিছুই করতে পারবেন না।

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

0

আপনি সহজেই একটি শূন্য প্রিন্টার মুদ্রণ করতে পারেন

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

1
voidএর সমান আকারের গ্যারান্টি দেয় কে int?
Ant_222

এটি প্রযুক্তিগতভাবে কোনও voidপয়েন্টার মুদ্রণ করছে না , এটি পয়েন্টারটিতে intথাকা মেমরি ঠিকানায় মুদ্রণ করছে (যা এই ক্ষেত্রে এর মান হবে p)।
মেরিওনিম্বার 1

0

যেহেতু সি স্ট্যাটিকালি-টাইপড, দৃ strongly়ভাবে টাইপযুক্ত ভাষা, আপনাকে কম্পাইল করার আগে অবশ্যই ভেরিয়েবলের ধরণ স্থির করতে হবে। আপনি যখন সিটিতে জেনেরিকগুলি অনুকরণ করার চেষ্টা করবেন, আপনি আবার সি ++ পুনরায় লেখার প্রয়াস শেষ করবেন, সুতরাং পরিবর্তে সি ++ ব্যবহার করা ভাল।


0

অকার্যকর পয়েন্টার একটি জেনেরিক পয়েন্টার .. কোনও ভেরিয়েবলের যে কোনও ডেটাটাইপের ঠিকানা একটি শূন্য পয়েন্টার নির্ধারিত হতে পারে।

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

0

আপনি কোনও পয়েন্টারটির ধরণ উল্লেখ না করেই তাকে ডিফারেন্স করতে পারবেন না কারণ বিভিন্ন ডেটা টাইপের মেমরিতে বিভিন্ন আকার থাকতে পারে অর্থাত্ একটি বাইট 4 বাইট, চার্ট 1 বাইট।


-1

মৌলিকভাবে, সি তে, "প্রকারগুলি" মেমরিতে বাইটগুলি ব্যাখ্যা করার একটি উপায়। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি কী

struct Point {
  int x;
  int y;
};

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

বলে যে "আমি যখন প্রধান চালনা করি তখন আমি 4 (পূর্ণসংখ্যার আকার) + 4 (পূর্ণসংখ্যার আকার) = 8 (মোট বাইট) মেমরির বরাদ্দ করতে চাই When সংকলনের সময় পয়েন্ট, পয়েন্টারের মেমরি অবস্থান এবং চারটি বাইট থেকে ডেটা পুনরুদ্ধার করুন the রিটার্নটির মানটি সংকলন-সময় লেবেলটি "ইনট" দিন "

রানটাইমের সময় কম্পিউটারের অভ্যন্তরে আপনার "পয়েন্ট" কাঠামোটি এমন দেখাচ্ছে:

00000000 00000000 00000000 00000000 00000000 00000000 00000000

এবং আপনার void*ডেটা টাইপের মতো দেখতে এখানে রয়েছে: (একটি 32-বিট কম্পিউটার ধরে)

10001010 11111001 00010010 11000101

এটি প্রশ্নের উত্তর দেয় না
এমএম

-2

এটি কাজ করবে না, তবুও অকার্যকর * ফাংশনগুলিতে জেনেরিক পয়েন্টার সংজ্ঞায়িত করতে এবং এটি অন্য ফাংশনের (জাভাতে কলব্যাকের অনুরূপ) আর্গুমেন্ট হিসাবে পাস করার জন্য বা এটি ওওপের মতো কাঠামো সংজ্ঞায়িত করতে অনেক সাহায্য করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.