2016-05-15 46 views
8

Tôi chỉ tự hỏi nếu có một cách để tạo một mảng con trỏ trỏ đến cột đầu tiên của mỗi hàng trong một dãy số nguyên nhiều chiều. Như một ví dụ, hãy nhìn vào đoạn mã sau:Mảng của con trỏ trỏ đến mảng số nguyên

#include <stdio.h> 

int day_of_year(int year, int month, int day); 

main() 
{ 
    printf("Day of year = %d\n", day_of_year(2016, 2, 1)); 
    return 0; 
} 

static int daytab[2][13] = { 
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

int day_of_year(int year, int month, int day) 
{ 
    int leap; 
    int *nlptr = &daytab[0][0]; 
    int *lpptr = &daytab[1][0]; 
    int *nlend = nlptr + month; 
    int *lpend = lpptr + month; 

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; 
    if (leap) 
     for (; lpptr < lpend; lpptr++) 
      day += *lpptr; 
    else 
     for (; nlptr < nlend; nlptr++) 
      day += *nlptr; 
    return day; 
} 

Khi tôi viết như thế này dưới đây:

int *p[2]; 
*p[0] = daytab[0][0]; 
*p[1] = daytab[1][0]; 

tôi nhận được một lỗi như thế này:

Error: Array must have at least one element 
Error: Variable 'p' is initialized more than once 
Error: { expected 
Error: Variable 'p' is initialized more than once 
Error: { expected 
***5 errors in Compile*** 

tôi đã thay đổi nó như này:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

Tôi vẫn nhận được cùng một lỗi.

tôi biết chúng tôi có thể làm cho một mảng của con trỏ đến chuỗi ký tự như trong những điều sau đây:

char *str[] = { 
    "One", "Two", "Three", 
    "Four", "Five", "Six", 
    "Seven", "Eight", "Nine" 
} 

Làm thế nào để chúng tôi làm điều đó cho mảng các số nguyên?

+0

"* Nó không làm việc *" là báo cáo lỗi nhiều hay ít giá trị người ta có thể đưa ra. Vui lòng chính xác hơn về lỗi, cảnh báo, sự cố bạn gặp phải, quan sát! – alk

+2

Ví dụ đầu tiên: cơ hội lớn để gây ra Phân đoạn Lỗi bởi dereferencing con trỏ không hợp lệ Ví dụ thứ hai: Bạn có giải thích những gì bạn có nghĩa là "không làm việc"? – MikeCAT

+1

Mã như được hiển thị (sử dụng phương pháp thứ 2) có vẻ phù hợp với tôi. – alk

Trả lời

2

Mã của bạn nên làm việc như quyến rũ:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

printf("%d \n", p[0][2]); // shows: 28 
printf("%d \n", p[1][2]); // shows: 29 

này cũng hoạt động:

int *p[2] = { &daytab[0][0],&daytab[1][0] }; 
+0

Mã cũ, khi được biên dịch, tiếp tục cho tôi các lỗi mà tôi đã đề cập ở trên, mặc dù tôi nghĩ rằng nó không nên. Nhưng cái sau lại làm việc cho tôi, và nó làm cho chương trình nhỏ gọn hơn, loại bỏ sự cần thiết của người khác. Cảm ơn bạn. –

+0

Mã thứ hai hoạt động khi tôi biên dịch nó dưới dạng cpp. Nhưng khi tôi biên dịch nó thành c, tôi nhận được lỗi 'Khởi tạo bất hợp pháp trong hàm day_of_year' tại dòng' int * pe [2] = {p [0] + tháng, p [1] + tháng}; '. –

+1

Như đã đề cập bởi Alk, hãy nâng cấp trình biên dịch của bạn càng sớm càng tốt. Nó đã lỗi thời vào những năm 90 và nó chắc chắn sẽ cho bạn nhiều đau đầu. – tomekpe

1

Nếu đó là về việc thay đổi định nghĩa của daytab đi giống như ví dụ thứ 3 bạn có thể muốn sử dụng này:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

thay thế.

Hoặc ở lại lưu và đánh dấu kết thúc của mảng bằng cách sử dụng một trọng điểm thực hiện:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    NULL 
}; 

Hoặc^2 để ở lại thậm chí tiết kiệm đánh dấu cũng là mảng bên trong kết thúc:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    NULL 
}; 

Xin lưu ý rằng các hợp chất ((Type){Initialiser}) được sử dụng ở đây chỉ khả dụng từ C99 trở lên.

1

Sử dụng như dưới đây

int *p[2]; p[0] = daytab[0]; p[1] = daytab[1];

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