30/09/2018, 16:38

Hỏi về bản chất con trỏ?

// Tìm phần tử có giá trị x trong mảng a[] có n phần tử,lưu index của x vào mảng iResult[]
int Search(int a[], int n, int x)
{
	int *iResult = new int[];
	for (int iCount = 0; iCount < n; iCount++)
	for (int iCount2 = 0; iCount2 < n;iCount2++)
	{
		if (a[iCount] == x);
			iResult[iCount2] = iCount;
	}
	return *iResult;
}

đây là hàm tìm tất cả các phần tử có khóa là x trong mảng a[n],lưu chỉ mục(index) của x vào mảng iResult[],hàm này sẽ trả về giá trị là 1 con trỏ,1 mảng con trỏ,hay 1 mảng các số nguyên ?
Và khi khai báo biến trong hàm main thì phải khai báo như thế nào ?

int iSearch = Search(a,100,10);
int *iSearch = Search(a,100,10);
int iSearch[] = Search(a,100,10);
int iSearch = *Search(a,100,10);

Khai báo như thế nào cũng ko đc

Nguyễn Anh Dũng viết 18:38 ngày 30/09/2018

Khai báo như câu b nó báo lỗi giá trị kiểu int không thể sử dụng để khởi tạo 1 thực thể kiểu int *

Tuấn Nguyễn viết 18:52 ngày 30/09/2018

nếu bạn return iResult; thì nó return con trỏ trỏ tới ô đầu của iResult. Ở đây bạn để hàm trả về kiểu int và để return *iResult thì là trả về giá trị ô đầu <=> return iResult[0]; BreakDown sai khi nói hàm này trả về 1 con trỏ. Nó trả về 1 giá trị !

Tuấn Nguyễn viết 18:45 ngày 30/09/2018

Nói luôn phép gán câu a sẽ hợp lệ

Nguyễn Anh Dũng viết 18:44 ngày 30/09/2018

Hợp lệ nhưng là sai bản chất của vấn đề muốn giải quyết

Tuấn Nguyễn viết 18:46 ngày 30/09/2018

Bạn muốn nó trả về 1 con trỏ mà con trỏ đấy quản lý các biến là index đúng ko thớt?

Nguyễn Anh Dũng viết 18:51 ngày 30/09/2018

đúng rồi,hoặc có thể nào đơn giản hơn là trả về 1 mảng tĩnh lưu các biến index ko ?

Tuấn Nguyễn viết 18:48 ngày 30/09/2018

Bạn nhớ 1 kiến thức quan trong như thế này. Con trỏ cấp n sẽ quản lý con trỏ cấp n - 1 ( n >= 2)
VD: Con trỏ cấp 1 quản lý các biến bình thường
Con trỏ cấp 2 quản lý các con trỏ cấp 1
Con trỏ cấp 3 quản lý các con trỏ cấp 2

Con trỏ cấp n quản lý các con trỏ cấp n - 1

Nguyễn Anh Dũng viết 18:46 ngày 30/09/2018

mình đặc biệt mơ hồ về con trỏ,cậu edit source + giải thích cặn kẽ được ko ?

Tuấn Nguyễn viết 18:38 ngày 30/09/2018

ok xong ngay ấy mà :v

Tuấn Nguyễn viết 18:50 ngày 30/09/2018

Thuật toán bạn xây dựng à? hình như có vấn đề về thuật toán

Nguyễn Anh Dũng viết 18:41 ngày 30/09/2018

vấn đề nằm ở đâu ? 20 char @@

Tuấn Nguyễn viết 18:41 ngày 30/09/2018

Mình sửa luôn thuật toán của bạn bị vòng lặp vô tận rùi. Hàm trả về con trỏ là vậy. Bạn để dấu * vào là trả về giá trị của ô đầu.

#include <stdio.h>
#include <conio.h>
int sizeb = 0;
int* Search(int a[], int n, int x)
{
int *iResult = new int[10];
for (int iCount = 0; iCount < n; iCount++)
{
   if (a[iCount] == x)
  {
	iResult[sizeb] = iCount;
	sizeb++;
 }
}
return iResult;
}

void main()
{
	  int *a = new int[5];
	  a[0] = 1;
	  a[1] = 2;
	  a[2] = 3;
	  a[3] = 1;
	  a[4] = 1;
	  int x = 1;
	  int *b = Search(a,5,x);
	  for(int i = 0; i < sizeb; i++)
		  printf("%d\t",*(b+i));
	  getch();
}
Tuấn Nguyễn viết 18:44 ngày 30/09/2018

int*

Kiểu trả về là int* tức là trả về 1 con trỏ cấp 1 trỏ tới kiểu các biến int nhé.

Nguyễn Anh Dũng viết 18:50 ngày 30/09/2018

OK,đã thông tks bạn
à khai báo int *iResult = new int[10] >> cấp phát động thì cho kích thước làm gì :3

Itachi Citus viết 18:39 ngày 30/09/2018

… Bạn nên học kỹ về con trỏ trước khi đặt thêm câu hỏi.

Bài liên quan
0