C में सरणी का पता ** में परिवर्तनीय क्यों नहीं है?


नमस्ते। सरणी का पता क्यों है (अर्थात? &) में परिवर्तनीय नहीं है ** सी में?

मैंने क्या प्रयास किया है:

मैंने निम्नलिखित प्रयास किया..

सी
#include <stdio.h>


int main()
{
    int** a;
    int b[5];
    b[1] = 123;
    
    //a = &b; //< results in output of warning "assignment to ‘int **’ from incompatible pointer type ‘int (*)[5]’"
    int* c = b;
    a = &c; //< this works
    printf("*a is %i\n", (*a)[1]);
    
    return 0;
}

मैं इसकी अपेक्षा करूंगा, जैसे b में परिवर्तित किया जा सकता है int*परिवर्तित करना संभव होगा &b को int**. हालाँकि, इसके परिणामस्वरूप उपरोक्त कोड ब्लॉक में उल्लिखित चेतावनी सामने आती है।

विंडोज़ पर मिंगडब्ल्यू जीसीसी का उपयोग करना (लिखना और फिर ए से पढ़ना)। ** वह एक सारणी के पते को सौंपा गया था) वास्तव में एक बार काम किया लेकिन दूसरी बार नहीं।

समाधान 1

b एक सरणी है: किसी सरणी का नाम पहले तत्व के लिए एक सूचक है, इसलिए तकनीकी रूप से, &b एक पूर्णांक के लिए एक सूचक के लिए एक सूचक है। लेकिन… आपका कंपाइलर सहमत नहीं है क्योंकि यह (उचित रूप से) इसे पूर्णांकों की एक सरणी के लिए एक सूचक मानता है। और ऐरे पृष्ठभूमि में चल रहे सूचक अंकगणित के लिए एक वाक्यात्मक चीनी हैं, इसलिए वे उतना काम नहीं करते जितना आप सोच सकते हैं।
आप इसे बनाकर गोल कर सकते हैं b इसके बजाय एक int के लिए एक सूचक:

सी
#include <stdio.h>
#include <malloc.h>
int main()
    {
    int** a;
    int* b = malloc(sizeof(int) * 5);
    b[1] = 123;
    
    a = &b; 
    printf("*a is %i\n", (*a)[1]);

    free(b);
    return 0;
    }

コメント

タイトルとURLをコピーしました