Hỏi về con trỏ trong C?

http://www.learntosolveit.com/cprogramming/Ex_5.11_conddetab.html
Trong link này có đoạn pos = atoi(&(*++argv)[1]);. Cho em hỏi tại sao lại phải có dấu & , vì theo em biết & là để lấy địa chỉ ô nhớ chứ không phải giá trị nhưng kết quả in ra thì lại là giá trị truyền vào ?

1 Like

Như em đã nói dùng & để lấy địa chỉ. Hàm atoi có cú pháp int atoi(const char *str) , địa chỉ của một mảng hay là chuỗi cũng là địa chỉ của ký tự đầu tiền của nó, do đó thì chúng ta dùng &. sau khi qua hàm atoi nó sẽ phân tích chuỗi và trả ra một số nguyên.

2 Likes

Vậy cho em hỏi chút là

  • argv ở đây có phải là 1 mảng không nhỉ :thinking:.
  • Nếu đúng thì cung cấp cho anh 1 thông tin là tên của mảng có thể dùng như 1 con trỏ. Vậy thì ++argv ở đây có tác dụng gì nè.
  • Toán tử * trước con trỏ thì có tác dụng nè.
  • Anh có biết [1] đằng sau đó để làm gì không nè.
    Nếu anh biết hết những cái trên thì chúng ta xem lại về hàm atoi nhé
atoi(const char* );

Hàm này yêu cầu truyền vào giá trị như thế nào nè.
Một câu lệnh sử dụng 1 lượng toán tử không hề nhỏ :+1:t2:.

1 Like

dạ, nhưng khi em printf("%s \n",&(*++argv)[1])) thì lại in ra giá trị mà không phải địa chỉ ạ , và khi em bỏ dấu & đi thì báo lỗi segmentation fault . Theo em nghĩ thì muốn lấy giá trị thì chỉ là (*++argv)[1] thôi chứ ạ

Cái này thì có thể hiểu thế này:
Khi sử dụng 1 định dạng %s để in ra màn hình 1 mảng kí tự (1 xâu) ta dùng như sau:

printf("%s", arr);

Như em nói ở trên thì tên của mảng và 1 con trỏ có những điểm tương đồng. Vậy thì thay vì sử dụng tên của mảng ta có thể sử dụng 1 con trỏ trỏ đến địa chỉ của mảng arr như thế này được không nè.

printf("%s", &arr[0]);

Chi tiết anh tìm theo từ khoá mảng và con trỏ
Tương tự liên hệ đến cái anh cần nha :grin:
Không biết em hiểu thế đúng không. Có gì sai mong mọi người sửa lại.

Anh nghĩ em nên tìm hiểu kỹ về mảng cũng như con trỏ trước khi cố gắng đọc hiểu bài đó. Với lại cái bài em đưa lên cũng chưa làm chuẩn lắm đâu. Cho ví dụ nè:

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

void parseInt( char string[][100]){
    printf("%s\n", &(*string)[1]);
    printf("%d", atoi(&(*string)[1]));
}
int main(){
    char string[1][100] = {"123456789"};
    parseInt( string );
}
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?