Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: cho mình hỏi về cách dùng con trỏ và mảng

  1. #1
    Ngày gia nhập
    11 2007
    Bài viết
    153

    Question cho mình hỏi về cách dùng con trỏ và mảng

    hix hix mình đã học qua bài mảng giờ tới con trỏ nhưng khi sử dụng con trỏ thay thế cho mảng thì lại bị loạn vì nhiều ứng dụng của con trỏ thay cho mảng quá các bạn cho mình hỏi với code thế này:
    Code:
    oid main()
    {
      char *ptr[5];
      int i;
      int j;
      char cpyptr1[5][10],cpyptr2[5][10];
     
    	
    char *temp;// bien dem de trao doi cac xau ky tu 
    
      for (i=0;i<5;i++)
       {
         printf("\n Enter a String : ");
    	 scanf("%s",cpyptr1[i]);
    	 ptr[i] = cpyptr1[i];
    	}// cho phep nhap 5 xau ky tu 
      for (i=0;i<5;i++)
        strcpy(cpyptr2[i],cpyptr1[i]);
      for (i=0;i<4;i++)
        {
    	  for (j=i+1;j<5;j++)
    	  {
    	    if (strcmp(ptr[i],ptr[j])>0)
    		{
    		  temp=ptr[i];
    		  ptr[i]=ptr[j];
    		  ptr[j]=temp;
    		}
          }
        }
      printf("\n The Original List It ");
      for (i=0;i<5;i++)
       printf("\n%s", cpyptr2[i]);
      printf("\n The Sorted list is ");
      for(i=0;i<5;i++)
       printf("\n%s", ptr[i]);
      getch();
    }
    và code này :
    Code:
    int m1[100][100];
    int m2[100][100];
    int m3[100][100];
    int a,b,c,d,e,f,g,h;
    int w,r;
    clrscr();
    printf("\n xin nhap so dong va cot cua mang 1:");
    scanf("%d%d",&a,&b);
    
    for(c=0;c<a;c++)
    {
    for(d=0;d<b;d++)
    {
    printf("\n xin nhap phan tu thu %d cua mang 1:",d);
    scanf("%d",&m1[c][d]);
    }
     }
    
    printf("\n sau khi nhap xong in ra so phan tu vua nhap cua mang 1 la:");
    
    for(c=0;c<a;c++)
    {
    printf("\n");
    
    for(d=0;d<b;d++)
    {
    printf("%3d ",m1[c][d]);
    
    }
      }
    thì tại sao mảng ở đây lại đc dùng khác nhau thế, cái đoạn code đầu tiên mình ko hiểu về con trỏ ptr[5] nghĩa là sao ?? nếu mình sử dụng cấp bộ nhớ động thì fải làm sao với bài dạng kiểu đấy??và mình khai mảng cpyptr1 2 chiều rồi khi dùng lại nhập có 1 chiều là sao ?? sao nó ko giống với code 2 tai fải nhập 2 dự liệu vào mảng m1????
    Chết hỏi nhiều quá rồi chắc mọi người không phiền bạn nào biết chỉ giúp mình với mình nghe nói bài con trỏ khá khó nhằn trog giáo trình C.Mình xin cảm ơn các bạn rất nhiều^^!!

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    khi khai báo char *ptr[5] tức là đã khai báo một một mảng gồm 5 biến con trỏ ptr liên tiếp nhau. Hãy suy nghĩ đơn giản như việc khai báo một mảng các biến thông thường.

    Còn về việc cấp phát bộ nhớ động thì bạn cần sử dụng đến hàm cấp phát bộ nhớ malloc để cấp phát, cú pháp của nó là void *malloc(size_t size);. Tham khảo thêm các code mẫu trên diễn đàn hoặc MSDN. Với code thứ nhất cần phải cấp phát bộ nhớ cho con trỏ ptr trước khi sử dụng, nếu bạn sử dụng như vậy sẽ không an toàn dữ liệu và gây ra lỗi.

    Thực ra thì cấu trúc bộ nhớ được bố trí dưới dạng phẳng, cho nên mảng 2 chiều hay mảng nhiều chiều cũng chỉ là mảng một chiều mà thôi (có người nói là nhiều mảng một chiều liên tiếp). Nếu muốn biết rõ bạn cần tìm hiểu về cơ chế quản lý bộ nhớ của máy tính, không thể dăm ba câu là hiểu được.

    Chúc thành công! Nên đọc thêm tài liệu nhé!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    11 2007
    Bài viết
    153

    cảm ơn anh DR rất nhiều đành fải kiếm tài liệu đọc vậy nhưng em vẫn ko hiểu cái đoạn mà ta khai *ptr[5] vậy ở đây là có 5 con trỏ đc dùng trên cùng 1 mảng thế tại sao ko khai là ptr[5] cho xong hoặc dùng con trỏ *ptr thôi ko cần khai mảng ? tại con trỏ nó chỏ đến nơi chứa giá trị cần can thiệp còn gì?
    Code:
    char *temp;
      for (i=0;i<5;i++)
       {
         printf("\n Enter a String : ");
    	 scanf("%s",cpyptr1[i]);
    	 ptr[i] = cpyptr1[i];//
    ở code trên thì ta có thể gán ptr=cpyptr1 cũng đc đúng ko tại sao lại fải gán như ptr[i]=cpyptr1[i] làm gì???

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    ở code trên thì ta có thể gán ptr=cpyptr1 cũng đc đúng ko tại sao lại fải gán như ptr[i]=cpyptr1[i] làm gì???
    bạn thử vậy xem có đúng không ?

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    Lang thang
    Bài viết
    7

    -Trong đoạn code thứ nhất:cpyptr1[index1][index2] là mảng hai chiều của char, index1 chỉ sốlượng xâu (hay chính là số phần tử của mảng), index2 chỉ ra kích thước tối đa mà mỗi xâu bạn nhập vào,chính vì thế mà khi nhập bạn chỉ nhập scanf("%s",cpyptr[i]), còn trong code 2 m1[][] là một mảng hai chiều của kiểu int,bạn hình dung nó như ma trận vậy,chính vì thế mà phải nhập hai chiều.
    -Như bác Dr nói,dù là mảng hai chiều hay n chiều đi nữa thì việc lưu trữ các phần tử của mảng trong bộ nhớ được lưu theo kiểu ưu tiên hàng( hoặc cột) nghĩa là hết hàng này rồi tới hàng khác.
    -Còn về *ptr[5], đây là một mảng 5 con trỏ kiểu ký tự,mỗi con trỏ sẽ trỏ tới một trong năm xâu mà bạn nhập vào-phục vụ cho mục đích đổi chỗ của bạn,chính vì đổi chỗ các xâu cho nhau nên bạn phải khai báo mảng con trỏ,không thể đổi thông thường theo kiểu
    Code:
    temp = cpyptr1[i];
                     cpyptr1[i] = cpyptr2[j];
                     cpyptr2[j] = temp;
    hì hì sai về bản chất,thế nên không thể khai ptr[],còn nếu chỉ khai *ptr mà không dùng mảng thì không đổi chỗ các xâu được.

    Code:
    char *temp;
      for (i=0;i<5;i++)
       {
         printf("\n Enter a String : ");
    	 scanf("%s",cpyptr1[i]);
    	 ptr[i] = cpyptr1[i];//
    đoạn code trên nếu bạn gán ptr = cpyptr1,nếu bạn gán ptr = cpyptr1 thì hẳn không được rồi,vì bản thân ptr[] và cpyptr1[] là mảng,tên của mảng ptr và cpyptr1 chính là các con trỏ tới phần tử đầu tiên trong mảng tương ứng của nó.
    -Nói tóm lại,bạn phải xem mục đích chương trình của mình làm gì,vấn đề con trỏ nói chung là khá khó,bạn đừng lo,chịu khó nghiên cứu chút là sáng tỏ thôi,Good luck !
    Đã được chỉnh sửa lần cuối bởi Achillesbk : 03-12-2007 lúc 01:06 AM.
    Người đẹp lại lấy người xinh.bao nhiêu kẻ xấu rập rình lấy nhau !!!

  6. #6
    Ngày gia nhập
    11 2007
    Bài viết
    153

    Mặc định cho mình hỏi về cách dùng con trỏ và mảng

    hơ hơ hơi hiểu hiểu rồi cám ơn các bạn rất nhiều mình sẽ thử tìm hiểu thêm vậy >"< ^^!!

Các đề tài tương tự

  1. Upload file dùng Ajax mà ko dùng Method Post của Form như thế nào?
    Gửi bởi hieupxd2cntt trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 8
    Bài viết cuối: 14-09-2014, 10:23 PM
  2. Lập trình C++ trong visual studio có cách nào để dùng winform mà vẫn dùng cách viết trên c++ được ?
    Gửi bởi homgiaouoc trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 08-10-2013, 12:50 PM
  3. Bài toán quản lí nhân viên dùng dùng danh sách liên kết trong C++. Mong mọi người góp ý!
    Gửi bởi rataki trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 22-11-2012, 11:26 PM
  4. Bài tập C++ Dùng strtok cắt chuỗi và lỗi khi dùng atof() chuyển char sang float
    Gửi bởi salomontong trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 10-03-2012, 05:18 PM
  5. Tại sao dùng const trong trường hợp dùng biến tham chiếu
    Gửi bởi dinhdoong trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 13
    Bài viết cuối: 04-02-2012, 10:45 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn