Con trỏ và mảng (giả) 2 chiều

Nhờ mọi người chỉ giúp em tại sao lúc chạy chỉ nhập được a[0][0] rồi bị lỗi không chạy được nữa ạ.

#include<iostream>
using namespace std;
void nhapmtr(int *a, int &dong, int &cot)
{	
	for (int i = 0; i < dong*cot; i++)
	{
		cout << "a[" << i / cot << "][" << i % cot << "]= ";
		cin >> *(a + i);
	}
}
void xuatmtr(int *a, int dong, int cot)
{
	for (int i = 0; i < dong*cot; i++)
	{
		cout << *(a + i) << "\t";
		if (i%cot == cot - 1)
		{
			cout << endl;
		}
	}
}
int tongduong(int *a, int dong, int cot) // tổng các phần tử dương trong ma trận
{
	int tong = 0;
	for (int i = 0; i < dong*cot; i++)
	{
		if (*(a + i)>0)
			tong += *(a + i);
	}
	return tong;
}
bool laSNT(int soA) // kiểm tra số nguyên tố
{
	if (soA < 2)
		return false;

	for (int i = 2; i <= sqrt((float)soA); i++)
	{
		if (soA%i == 0)
		{
			return false;
		}
	}
	return true;
}
int demSNT(int *a, int dong, int cot)// đếm số nguyên tố 
{
	int dem = 0;
	for (int i = 0; i < dong*cot; i++)
	{
		if (laSNT(*a + i))
		{
			dem++;
		}
	}
	return dem;
}
int maxinbien(int *a, int dong, int cot) // phần tử lớn nhất trên biên
{
	int max = *a;
	for (int i = 0; i <= cot - 1; i++)
	{
		if (*(a + i) > max)
			max = *(a + i);
	}
	for (int i = 0; i <= cot * (dong - 1) - 1; i += cot)
	{
		if (*(a + i) > max)
			max = *(a + i);
	}
	for (int i = cot - 1; i <= dong*cot - 1; i += cot)
	{
		if (*(a + i) > max)
			max = *(a + i);
	}
	for (int i = (dong*cot - 5); i <= dong * cot - 1; i++)
	{
		if (*(a + i) > max)
			max = *(a + i);
	}
	return max;
}
int main()
{
	int dong, cot;
	int *a=NULL;
	cout << "nhap so dong: ";
	cin >> dong;
	cout << "nhap so cot: ";
	cin >> cot;
	nhapmtr(a, dong, cot);
	xuatmtr(a, dong, cot);
	int s=tongduong(a, dong, cot);
	cout << "Tong cac so duong bang: " << s << endl;
	int d = demSNT(a, dong, cot);
	cout << "So luong so nguyen to la: " << d << endl;
	int m = maxinbien(a, dong, cot);
	cout << "So lon nhat tren bien ma tran la: " << m << endl;	
    return 0;
}

con trỏ kiểu int thì chỉ như mảng 1 chiều thôi mà?

quên chưa cấp phát =))))

nhập dữ liệu bằng offset pointer thì sao dùng được *().

Chẳng qua là bạn nhìn không quen thôi, đó không phải là vấn đề ở đây.

1 Like

ý tôi là thớt trên nhập dữ liệu bằng *(v + b);

a[i] chỉ là cách viết khác của *(a+i) thôi, ý nghĩa tương tự.

1 Like

bạn không hiểu ý tôi, nếu output nó ra thì ta dùng offset với *, nhưng đây đang nhập dữ liệu vào, dùng *() nó bị lỗi biên dịch mà

Vậy bạn có bao giờ thắc mắc vì sao câu này đúng:
cin >> a[i];
mà câu này lại sai?
scanf("%d", *(a + i));

Đây là hai câu khác nhau hoàn toàn bạn à.

1 Like

cin >> a[i]: dùng array subcript để nhận giá trị, nó tương đương với (a + i): pointer offset với con trỏ là tên mảng. Tôi chưa học c++ nên nếu c++ có thể cin bằng cách ấy thì tôi xin nhận là tôi sai. Nhưng tôi chỉ biết là *(a + i) mà sử dụng trong scanf thì chẳng phải dụng dụng biến không có “&”.

a khai báo là con trỏ cấp 1

int *a=....

Thì a[0][0] là như thế nào nhỉ ?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?