2013-05-09 40 views
7

Trong đoạn mã sau:* (a ++) đang đưa ra lỗi nhưng không * (a + 1) ?? trong đó một tên mảng là gì?

void main() 
{ 
    char a[]={1,5,3,4,5,6}; 
    printf("%d\n",*(a++)); //line gives error: wrong type argument to increment 
    printf("%d\n",*(a+1)); 
} 

sự khác biệt giữa dòng 4 và dòng 5. Tôi không nhận được bất kỳ lỗi hoặc cảnh báo với dòng 5.

+1

Tôi không giỏi trong C, nhưng có lẽ bạn không thể tăng gấp đôi (ví dụ: toán tử '++'). – Voitcus

+9

Hoàn toàn tắt chủ đề nhưng 'void main()' == bad! Khi bạn nghĩ rằng 'void main()', hình ảnh ai đó đang đập bạn bằng một cây gậy. 'int main()', luôn luôn! – Yuushi

Trả lời

26

a là gì là một đối tượng mảng và không phải là một con trỏ để bạn không thể sử dụng thao tác a++ cho đối tượng mảng. vì đây là tương đương với:

a = a+ 1; 

Ở đây bạn được gán vào mảng đối tượng một giá trị mới mà không được phép trong C.

a + 1 trở lại một con trỏ tới phần tử 1 của a mảng của bạn và nó cho phép

3

'a' hoạt động giống như con trỏ const. 'a' không thể thay đổi giá trị của nó hoặc địa chỉ mà nó trỏ đến. Điều này là do trình biên dịch có bộ nhớ phân bổ tĩnh về kích thước của mảng và bạn đang thay đổi địa chỉ mà nó đang tham chiếu đến.

Bạn có thể làm điều đó như sau thay vì

void main() 
{ 
char a[]={1,5,3,4,5,6}; 
char *ch; 
ch=a; 
printf("%d\n",*(ch++)); //this lines gives error no more 
printf("%d\n",*(ch+1)); 
} 
+0

'a' không phải là con trỏ const. Đó là một mảng. –

+1

@ H2CO3 Tôi đã nói 'giả sử' 'a' là một con trỏ const. Tôi đã không gọi nó là một con trỏ const. –

+0

Nhưng đó cũng là sai ... –

4

rồi thực hành mã hóa xấu nghiêm túc: Tuy nhiên cho phép địa chỉ đầu tiên của vấn đề của bạn:

printf("%d\n",*(a++)); //this lines gives error: wrong type argument to increment 

không thể được sử dụng bởi vì a là một tham chiếu ngầm để mảng;

Bạn có thể làm điều này:

char b[]={1,5,3,4,5,6}; 
char *a = b; 
printf("%d\n",*(a++)); //this lines will not give errors any more 

và bạn tắt đi ...

Cũng *(a++) là không giống như *(a+1)++ nỗ lực để thay đổi toán hạng trong khi + chỉ cần thêm một giá trị không đổi a .

+0

Ngoài ra 'a ++' đánh giá giá trị cũ của 'a' và giá trị được lưu trữ của' a' được tăng lên (postincrement) – Joe

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