- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个关于这段代码的问题。
double*** pdata
Và int*** pmask
是什么意思?指向指针的指针?为什么或何时需要这样做?
số nguyên
Và gấp đôi
是不同的类型,double*
Và int*
也不同.我们可以在没有石膏的情况下对它们进行手术吗?
这是我感到困惑的代码:
static int makedatamask(int nrows, int ncols, double*** pdata, int*** pmask)
{ int i;
double** data;
int** mask;
data = malloc(nrows*sizeof(double*));
if(!data) return 0;
mask = malloc(nrows*sizeof(int*));
if(!mask)
{ free(data);
trả về 0;
}
for (i = 0; i < nrows; i++)
{ data[i] = malloc(ncols*sizeof(double));
if(!data[i]) break;
mask[i] = malloc(ncols*sizeof(int));
if(!mask[i])
{ free(data[i]);
phá vỡ;
}
}
if (i==nrows) /* break not encountered */
{ *pdata = data;
*pmask = mask;
return 1;
}
*pdata = NULL;
*pmask = NULL;
nrows = i;
for (i = 0; i < nrows; i++)
{ free(data[i]);
free(mask[i]);
}
free(data);
free(mask);
trả về 0;
}
1 Câu trả lời
是的——类型是三重指针或指向指针的指针。有时他们是必要的,但要非常害怕。在这种情况下,您正在分配两个大小相似的二维数组,并且您必须通过引用返回这两个值,因此三重指针是必需的,至少在您保持当前函数设计的同时。
是的 - double *
Và int *
是不同的类型;他们指向不同的类型。您可以在不强制转换的情况下对它们进行适当的操作。但是,如果您认为可以将两个并行操作合二为一,那您可能就错了。
如果您创建了一些子函数,您的错误恢复可能会更简单:
static int **alloc_2d_int_array(int nrows, int ncols)
{
...
}
static double **alloc_2d_double_array(int nrows, in ncols)
{
...
}
然后您的主要分配函数将简单地按顺序调用这两个函数。如果第二次失败,主分配函数将调用第一个分配数组的清理。清理代码可能需要相关的大小,因此您可能会:
static void free_2d_double_array(int nrows, double **array)
{
...
}
static void free_2d_int_array(int nrows, int **array)
{
...
}
这些函数甚至可能在源代码之外可见(不是tĩnh
).
您还可以考虑使用结构来描述数组(行和列)以及指向数组的指针。这也可以让您避免显式的三重指针表示法。
struct double_array
{
int nrows;
int ncols;
double **array;
};
vân vân.
关于关于函数中指针的 C 题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6948112/
Hàm sscanf() trong ngôn ngữ C: đọc tệp tiêu đề dữ liệu theo định dạng được chỉ định từ một chuỗi: ?
Gần đây, tôi gặp phải vấn đề với việc đánh giá trước công việc mà tôi không biết cách giải quyết ngay cả sau khi đã tìm hiểu cách thức hoạt động của từng chức năng. Sau đây là một mã giả. Dưới đây là một hàm có tên là foo() sẽ được truyền một giá trị và trả về một giá trị. Nếu bạn truyền giá trị sau vào hàm foo,
Hàm CStr trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Chuỗi. CStr(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể
Hàm CSng trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Đơn. CSng(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường,
Hàm CreateObject tạo và trả về tham chiếu đến đối tượng Automation. CreateObject(servername.typename [, location]) Tham số serv
Hàm Cos trả về cosin của một góc. Cos(số) Đối số số có thể là bất kỳ biểu thức số hợp lệ nào thể hiện góc tính bằng radian. Mô tả Hàm Cos lấy một góc và trả về tỷ số giữa hai cạnh của một tam giác vuông. Tỷ lệ này là
Hàm CLng trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con Long. CLng(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể sử dụng
Hàm CInt trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Số nguyên. CInt(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường,
Hàm Chr trả về ký tự tương ứng với mã ký tự ANSI đã chỉ định. Chr(charcode) Tham số charcode là một số xác định một ký tự. Mô tả Các số từ 0 đến 31 biểu thị tiêu chuẩn không in được
Hàm CDbl trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Double. CDbl(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể
Hàm CDate trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Date. CDate(date) Tham số ngày là bất kỳ biểu thức ngày hợp lệ nào. Mô tả Hàm IsDate được sử dụng để xác định d
Hàm CCur trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Currency. CCur(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường,
Hàm CByte trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Byte. CByte(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể
Hàm CBool trả về một biểu thức được chuyển đổi thành một Biến thể có kiểu con Boolean. CBool(expression) expression là bất kỳ biểu thức hợp lệ nào. Nếu cũ
Hàm Atn trả về cung tan của một số. Atn(số) Tham số số có thể là bất kỳ biểu thức số hợp lệ nào. Mô tả Hàm Atn tính tỉ số hai cạnh của một tam giác vuông (số) và trả về cung của góc tương ứng.
Hàm Asc trả về mã ký tự ANSI tương ứng với chữ cái đầu tiên của chuỗi. Asc(chuỗi) Tham số chuỗi là bất kỳ biểu thức chuỗi hợp lệ nào. Nếu đối số chuỗi không chứa ký tự, lỗi thời gian chạy sẽ xảy ra.
Hàm Array trả về một Biến thể chứa một mảng. Mảng(arglist) Đối số arglist là danh sách các giá trị được phân tách bằng dấu phẩy để gán cho các phần tử của mảng có trong Biến thể. Nếu tham số này không được chỉ định,
Hàm Abs trả về giá trị tuyệt đối của một số. Abs(số) Tham số số có thể là bất kỳ biểu thức số hợp lệ nào. Nếu number chứa Null, nó sẽ trả về Null; nếu đó là biến chưa được khởi tạo, nó sẽ trả về 0.
Hàm FormatPercent trả về một biểu thức được định dạng dưới dạng phần trăm (nhân với 100) với dấu % theo sau. Định dạngPhần trăm(biểu thức[,NumDigitsAfterD
Hàm FormatNumber trả về một biểu thức được định dạng dưới dạng số. Định dạngSố(biểu thức [,NumDigitsAfterDecimal [,Inc
Tôi là một lập trình viên xuất sắc, rất giỏi!