假设我在C中有一个指向char的指针数组:
char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };
Run Code Online (Sandbox Code Playgroud)
我希望使用qsort对这个数组进行排序:
qsort(data, 5, sizeof(char *), compare_function);
Run Code Online (Sandbox Code Playgroud)
我无法提出比较功能.由于某种原因,这不起作用:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = (const char *)name1;
const char *name2_ = (const char *)name2;
return strcmp(name1_, name2_);
}
Run Code Online (Sandbox Code Playgroud)
我做了很多搜索,发现我必须**
在qsort里面使用:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = *(const char **)name1;
const char *name2_ = *(const char **)name2;
return strcmp(name1_, name2_);
}
Run Code Online (Sandbox Code Playgroud)
这很有效.
任何人都可以解释*(const char **)name1
这个功能的使用吗?我根本不明白.为什么双指针?为什么我原来的功能不起作用?
谢谢,Boda …
我无法理解如何为双指针分配内存.我想读取一个字符串数组并存储它.
char **ptr;
fp = fopen("file.txt","r");
ptr = (char**)malloc(sizeof(char*)*50);
for(int i=0; i<20; i++)
{
ptr[i] = (char*)malloc(sizeof(char)*50);
fgets(ptr[i],50,fp);
}
Run Code Online (Sandbox Code Playgroud)
而不是这个我只是分配一个大的内存块并存储字符串
char **ptr;
ptr = (char**)malloc(sizeof(char)*50*50);
Run Code Online (Sandbox Code Playgroud)
那会错吗?如果是这样,为什么呢?
这里有一个简单的问题:有没有办法从锯齿状数组转换为双指针?
例如,转换double[][]
为double**
不幸的是,这不能仅仅通过铸造(就像它可以在普通的旧C中)一样.使用fixed
语句似乎也无法解决问题.在C#中是否有任何(最好尽可能高效)的方法来实现这一目标?我怀疑解决方案可能不是很明显,尽管我希望尽管是直截了当的.
在 C 中,我使用 achar **
来保存一系列字符串。
这是我的代码:
char ** c;
//now to fill c with data ????
//cannot change:
printf ("%*s%s", 0, "", *c);
while (*++w)
printf (" %s", *c);
Run Code Online (Sandbox Code Playgroud)
我不知道如何填充c
数据。正确的方法是什么?我无法更改 3 条打印行,因为它们位于外部函数中。
请考虑以下代码:
#include <stdio.h>
#include <stdlib.h>
#define NUM_ARRAYS 4
#define NUM_ELEMENTS 4
#define INVALID_VAL -1
int main()
{
int index = INVALID_VAL;
int array_index = INVALID_VAL;
int **ptr = NULL;
ptr = malloc(sizeof(int*)*NUM_ARRAYS);
if (!ptr)
{
printf ("\nMemory Allocation Failure !\n\n");
exit (EXIT_FAILURE);
}
for (index=0; index<NUM_ARRAYS; index++)
{
*(ptr+index) = malloc(sizeof(int)*NUM_ELEMENTS);
if (!*(ptr+index))
{
printf ("\nMemory Allocation Failure !\n");
exit (EXIT_FAILURE);
}
}
/* Fill Elements Into This 2-D Array */
for (index=0; index<NUM_ARRAYS; index++)
{
for (array_index = 0; …
Run Code Online (Sandbox Code Playgroud) 我正在查看https://en.cppreference.com/w/cpp/language/reinterpret_cast,我注意到它指定了我们可以始终转换为的合法类型:
byte*
char*
unsigned char*
但我并没有看到void*
在列表中。这是疏忽吗?我的用例需要一个,reinterpret_cast
因为我是从int**
转换为void*
。我最终会从void*
后面投射到镜头上int**
。
我几乎在那里,但我不太明白如何转换
unsigned char ** to a cv::Mat
Run Code Online (Sandbox Code Playgroud)
我知道cv :: Mat的.data部分是uchar*
我正在使用一个以...形式返回和图像的函数
unsigned char ** output;
Run Code Online (Sandbox Code Playgroud)
但我的其余代码使用cv :: Mat's.我没有我使用的lib的源代码,所以不知道它在做什么.
编辑 感谢帮助人员,我已经完成了这个......
cv::Mat TempMat = cv::Mat(h, w, CV_8UC1, *output);
imshow("this is a test",TempMat);
Run Code Online (Sandbox Code Playgroud)
但是图像是黑色的,所以我现在需要找出是否有任何东西存在.
很抱歉由于缺乏研究我在紧迫的期限内,不是不是家庭作业,试图准备好向教授展示结果!
我想使用双指针,我试图像这样声明.
NSString **a;
Run Code Online (Sandbox Code Playgroud)
但是,Xcode向我展示了错误"指向非const类型'NSString*'的指针,没有明确的所有权"并且无法编译.
最后我想这样做.
NSString **a;
NSString *b = @"b";
NSString *c = @"c";
a = &b;
*a = c;
NSLog(@"%@",b);//I wanna see "c"
Run Code Online (Sandbox Code Playgroud)
请告诉我任何建议.
variables objective-c double-pointer ios automatic-ref-counting
我是COBOL程序员,我的最新项目是将COBOL应用程序连接到SQLite3数据库.
我一直在关注本指南,他们的解决方案正是我在COBOL应用程序中所需要的.我已成功设法创建,连接,插入数据和关闭数据库,但当我尝试从数据库中选择数据时出现问题.
在本教程中,他们使用带有双指针的回调.
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在COBOL中的解决方案如下
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 sqlite3-db pointer.
01 err_msg pointer.
01 sqlite pointer.
01 res pointer.
01 notused pointer.
01 argc pic 99 comp-5.
01 argv pointer.
01 azColName pointer.
01 Writefunction-Ptr procedure-pointer.
procedure division.
set Writefunction-Ptr to entry "sqlite-callback".
*>Random code.
call "sqlite3_exec" using
by …
Run Code Online (Sandbox Code Playgroud) 我将一些较旧的高速 C++ 代码移植到 C#,现有代码使用了这样的基于指针的双间接模式(此处以 C# 语法编写),使用堆栈作为高效的临时存储:
\npublic struct Source {\n public byte* Start;\n public int Count;\n}\n\npublic struct SourceSet {\n public Source* Start;\n public int Count;\n}\n\nSource* sources = stackalloc Source[n*k];\nSourceSet* sourceSets = stackalloc SourceSet[n];\n
Run Code Online (Sandbox Code Playgroud)\nsources
它用数据段的集合填充,并用每组中有sourceSets
多少个来填充 。Source
该代码工作正常,但理想情况下,我想将其转换为不再使用指针和unsafe
\xe2\x80\x94 来代替使用像这样的内存安全的东西,其中每个都由一个源SourceSet
填充:.Slice()
public struct Source {\n public int Start;\n public int Count;\n}\n\nSpan<Source> sources = stackalloc Source[n*k];\nSpan<Span<Source>> sourceSets = stackalloc Span<Source>[n];\n
Run Code Online (Sandbox Code Playgroud)\n但我不能这么写,因为Span<Span<T>>
C# 中不能存在 \xe2\x80\x94Span<T>
是 a ref struct
,因此不能用作 …