2013-03-05 10 views
7
#include <stdlib.h> 
#include <stdio.h> 

int main (void) 
{ 
    int a[] = {1,2,3,4,5}; 
    int b[] = {0,0,0,0,0}; 
    int *p = b; 

    for (int i =0; i < 5; i++) 
    { 
     b[i] = a[i]+1; 
     *p = a[i]+1; 
     p++; 
    } 
    for (int i = 0; i < 5; i++) 
    { 
     printf (" %i \t %i \t %i \n", *p++, b[i], a[i]); 
    } 
    return 0; 
} 

इस कोड के लिए मुझे ए और बी के आउटपुट क्यों मिलते हैं लेकिन पॉइंटर का एक ही मूल्य क्यों होता है?सी पॉइंटर्स और सर

* पी बी [0] = एक [0] +1 है, है ना? तो पी ++ का अर्थ बी के लिए अगला पता है, इसलिए यह बी [1] = एक [1] +1 है।

ie 
*p b a 
1 2 1 
2 3 2 
3 4 3 
4 5 4 
5 6 5 
+0

आप अपने कॉलम गलत लेबल जोड़ने के लिए है: यह '* पी बी A', नहीं' एक ख * p' होना चाहिए। – dasblinkenlight

+0

हाँ मैंने किया, मेरा बुरा। फिक्स्ड – user2135885

+0

परिवर्तन-प्रतिरोध के लिए, बेहतर 'int b [sizeof (a)/sizeof (a [0])] = {... 'और' 5' मानों को उसी अवधि से प्रतिस्थापित करें। इस तरह, आप सरणी 'ए' बदल सकते हैं और सब ठीक हो जाएगा। – glglgl

उत्तर

9

आप अपरिभाषित व्यवहार हो रही है। पहले लूप p के अंत में b के "एक अतीत के अंत" को इंगित करता है। इसे रीसेट किए बिना, फिर आप इसे अस्वीकार करते हैं और इसे बढ़ाना जारी रखते हैं, जिनमें से दोनों अपरिभाषित व्यवहार का कारण बनते हैं।

यह हो सकता है कि आपके क्रियान्वयन के सरणी a सरणी b के बाद तुरंत संग्रहीत किया जाता है और p सरणी a में बात करने के लिए शुरू कर दिया है कि। यह एक संभव "अपरिभाषित" bavaviour होगा।

+0

तो मूल रूप से यह कुछ भी हो सकता है, बस इस मामले में यह इस मामले में स्मृति में अगले पते को इंगित करता है जो यह सरणी के प्रारंभिक तत्व को इंगित करता है? अगर मैं ग़लत हूं तो मेरी गलती सुझाएं। धन्यवाद – user2135885

+0

बिल्कुल। यह कुछ भी हो सकता है। सबसे अच्छा मामला यह है कि यह दुर्घटनाग्रस्त हो जाता है ताकि आप जानते हों कि कुछ गलत है। – UmNyobe

+0

@ user2135885: मेरे लिए यह एक उचित स्पष्टीकरण की तरह लगता है हालांकि यह संभव है कि आप जो संयोग देख रहे हैं उसके लिए एक और अस्पष्ट कारण है। –

-2

आपको प्रिंटिंग और सरणी के मानों को बढ़ाने के लिए अलग लूप नहीं बनाना चाहिए। एक ही पाश में दोनों करते हैं और follouwing कर उर उत्पादन प्राप्त करने के लिए :) # शामिल # शामिल

int main(void) 
{ 

int a[]={1,2,3,4,5}; 
int b[]={0,0,0,0,0}; 
int c[]={0,0,0,0,0}; 
int *p; 
int i; 
p=c; 
for(i =0 ; i<5 ; i++) 
{ 
    b[i]=a[i]+1; 
    *p=b[i]-1; 
    //*p++; 

//for(i =0 ; i<5 ; i++) 

    printf(" %i \t %i \t %i \n" ,*p,b[i],a[i]); 

} 
return 0; 
} 
1

{}, पी बी पर बिंदु के लिए पहले के बाद [5], लेकिन ख का आकार 5 , इसलिए बी [5] मान अनजान है, printf * p एक ही मान है [i], कारण स्मृति बी में हो सकता है [5] एक [0] है।

1

मुझे लगता है कि तुम क्या करने की जरूरत है एक p = p - 5;

#include <stdio.h> 
int main (void) 
{ 
    int a[] = {1,2,3,4,5}; 
    int b[] = {0,0,0,0,0}; 
    int *p = b; 
     int i =0; 

    for (i =0; i < 5; i++) 
    { 
     b[i] = a[i]+1; 
     *p = a[i]+1; 
     p++; 
    } 
    p = p - 5; 
    for (i = 0; i < 5; i++) 
    { 
     printf (" %i \t %i \t %i \n", *p++, b[i], a[i]); 
    } 
    return 0; 
} 
+0

बेहतर: 'पी = बी' फिर से, जैसा कि' 5' बदल सकता है। – glglgl

संबंधित मुद्दे