2013-03-05 58 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; 
} 

Đối với mã này tôi nhận được lý do tại sao đầu ra cho a và b nhưng tại sao con trỏ có cùng giá trị?con trỏ c và mảng

* p là b [0] = a [0] +1 phải không? Vì vậy, p + + có nghĩa là địa chỉ tiếp theo cho b vì vậy nó là b [1] = a [1] +1.

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

Bạn bị nhầm cột của bạn: nó phải là '* p b a', không phải' a b * p'. – dasblinkenlight

+0

yeah tôi đã làm, xấu của tôi. Cố định – user2135885

+0

Vì lợi ích của sự thay đổi kháng, tốt hơn làm 'int b [sizeof (a)/sizeof (a [0])] = {...' và thay thế các giá trị '5' bằng cùng một thuật ngữ. Bằng cách này, bạn có thể thay đổi mảng 'a' và mọi thứ sẽ ổn. – glglgl

Trả lời

9

Bạn đang nhận được hành vi chưa xác định. Ở cuối vòng lặp đầu tiên p trỏ đến "một trong quá khứ" của b. Nếu không đặt lại nó, bạn sau đó dereference nó và tiếp tục tăng nó, cả hai đều gây ra hành vi không xác định.

thể thể là tình hình thực hiện của bạn mảng a được lưu trữ ngay sau khi mảng bp đã bắt đầu chỉ vào mảng a. Đây sẽ là một bahaviour "không xác định" có thể.

+0

vì vậy về cơ bản nó có thể là bất cứ điều gì, chỉ trong trường hợp này nó xuất hiện để trỏ đến địa chỉ tiếp theo trong bộ nhớ trong trường hợp này mà nó trỏ đến phần tử bắt đầu của mảng a? đúng nếu tôi đã sai lầm. Cảm ơn chính xác – user2135885

+0

. nó có thể là bất cứ thứ gì. Trường hợp tốt nhất là nó bị treo, do đó bạn nhận thức được một cái gì đó là sai sớm. – UmNyobe

+0

@ user2135885: Đối với tôi, nó có vẻ giống như một lời giải thích hợp lý mặc dù có thể có một lý do mơ hồ hơn cho sự trùng hợp ngẫu nhiên mà bạn đang thấy. –

-2

bạn không nên tạo vòng lặp riêng để in và tăng giá trị của mảng. làm cả hai trong cùng một vòng lặp và làm follouwing để có được sản lượng ur :) #include #include

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

sau khi là người đầu tiên cho {}, điểm p tại b [5], nhưng kích thước của b là 5 , vì vậy giá trị b [5] không biết, printf * p có cùng giá trị với [i], lý do có thể là trong bộ nhớ b [5] là [0].

1

Tôi nghĩ rằng những gì bạn cần làm là thêm một 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

tốt hơn: 'p = b' một lần nữa, vì' 5' có thể thay đổi. – glglgl

Các vấn đề liên quan