i में scanf और sum में बेकार नहीं है? यह कुछ भी नहीं बदलता है, यहां तक ​​कि जब मैं &ptr प्रिंट करता हूं तो यह मुझे स्मृति मानों में कोई अंतर नहीं दिखाता है।

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, *ptr, sum = 0;

    printf("Enter number of elements: ");
    scanf("%d", &n);

    ptr = (int *)malloc(n * sizeof(int));

    // if memory cannot be allocated
    if (ptr == NULL) {
        printf("Error! memory not allocated.");
        exit(0);
    }

    printf("Enter elements: ");
    for (int i = 0; i < n; ++i) {
        scanf("%d", ptr + i);
        sum = sum + *(ptr + i);
    }

    printf("Sum = %d", sum);

    // deallocating the memory
    free(ptr);

    return 0;
}
0
Björn Eisenberger 17 मई 2020, 21:30

5 जवाब

सबसे बढ़िया उत्तर

यदि आप योग और स्कैनफ दोनों में 'i' का उपयोग नहीं करते हैं, तो योग पर कोई प्रभाव नहीं पड़ेगा क्योंकि यह गतिशील स्मृति की पहली अनुक्रमणिका में इनपुट लेगा और इसे अधिलेखित कर देगा। यह 'i' डायनेमिक मेमोरी में इनपुट स्टोर करने में मदद कर रहा है।

1
Muhammad Bilal 17 मई 2020, 21:46

'मैं' सूचक को बदलने वाला नहीं है। इसका उपयोग उस सरणी के i'th तत्व तक पहुँचने के लिए किया जाता है जिसे PTR इंगित करता है। I के बिना यह इस सरणी में उसी तत्व के लिए स्कैन करेगा, पहला तत्व

2
Ronen Hanukayev 17 मई 2020, 21:33

"फॉर लूप के अंदर int i क्या करता है?"

i का उपयोग पॉइंटर ऑफ़सेट के लिए गतिशील रूप से आवंटित मेमोरी के बाद के int ऑब्जेक्ट तक पहुंचने के लिए किया जाता है।

यह काम करता है:

(value of ptr [address of pointed object by ptr] + (i * sizeof(pointed object by ptr))).

शायद इस स्टैक ओवरफ़्लो प्रश्न पर एक नज़र डालें।

नोट: उद्देश्य केवल वस्तुओं की ओर इशारा करना और संशोधित करना है, न कि स्वयं सूचक। ptr इस सूचक अंकगणित के कारण परिवर्तित नहीं होगा।

"यह कुछ भी नहीं बदलता है, यहां तक ​​कि जब मैं &ptr प्रिंट करता हूं तो यह मुझे स्मृति मानों में कोई अंतर नहीं दिखाता है।"

शायद यह अलग-अलग मान नहीं दिखाता है क्योंकि आप पॉइंटर के पते को ही प्रिंट करते हैं, जो ऑफ़सेट का उपयोग करके पॉइंटर में नहीं बदलता है।

मैं "शायद" इसलिए कहता हूं क्योंकि मुझे नहीं पता कि आप वास्तव में ptr का पता कैसे प्रिंट करते हैं। हो सकता है कि आपके पास किसी प्रकार का अपरिभाषित व्यवहार भी हो।

2
RobertS supports Monica Cellio 17 मई 2020, 22:52

'i' एक बेकार मूल्य नहीं है, इसका उपयोग गतिशील सरणी के सही तत्व तक पहुंचने के लिए पॉइंटर को ऑफ़सेट करने के लिए किया जाता है।

यह उपयोग करने जैसा ही है

for (int i = 0; i < n; ++i) {
        scanf("%d", &ptr[i]);
        sum = sum + ptr[i];
    }
1
Pranav appu 17 मई 2020, 21:41

for में सूचकांक i का उद्देश्य दुगना है:

  • सुनिश्चित करें कि n नंबर पढ़े गए हैं और sum में संकलित हैं।
  • प्रत्येक परिवर्तित संख्या को ptr द्वारा इंगित सरणी में एक अलग प्रविष्टि में संग्रहीत करें।

यह देखते हुए कि कार्यक्रम क्या करता है, संख्याओं को एक सरणी में संग्रहीत करने की आवश्यकता नहीं है, या इस सरणी को आवंटित करने के लिए भी आवश्यक नहीं है।

यहाँ एक सरल संस्करण है:

#include <stdio.h>

int main() {
    int n, v, sum = 0;

    printf("Enter number of elements: ");
    if (scanf("%d", &n) != 1)
        return 1;

    printf("Enter elements: ");
    for (int i = 0; i < n; i++) {
        if (scanf("%d", &v) != 1) {
            printf("input error\n");
            break;
        }
        sum = sum + v;
    }
    printf("Sum = %d\n", sum);
    return 0;
}
1
chqrlie 17 मई 2020, 21:44