- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在大学里我们做了这段代码:
int cargaArreglo(int ** A);
int main(){
int * A = NULL;
int i = 0;
int dimension = cargaArreglo(&A);
for( i = 0; i < dimension; i++ )
printf( "[%d]", A[i] );
free( A );
return 0;
}
int cargaArreglo(int ** A){
int i = 0;
char bandera = 's';
(*A) = malloc( 1*sizeof(int) );
while( bandera != 'n' ){
printf( "Ingrese un numero" );
scanf( "%d", &(*A)[i] );
printf( "Desea seguir ingresando?" );
i++;
fflush( stdin );
scanf( "%c", &bandera );
if( bandera != 'n' )
(*A) = realloc( (*A), (i+1)*sizeof(int) );
}
return i;
}
我们尝试加载一个动态数组,并无限制地添加值。代码工作得很好,但是在我们需要用双指针声明参数的函数中,是否存在将其转换为简单指针的任何可能性?我的意思是,老师说那是不可能的,因为没有双指针我不能改变全局变量的值。这让我混淆了对指针的尊重。
感谢您的宝贵时间!
PD:如果您发现我的英语有误,请告诉我,因为这对我的学习有很大帮助。
最佳答案
如果您不喜欢指向指针的指针,您始终可以修改函数的签名,以便它返回新的指针值以分配给 A,并通过指针设置维度值:
[...]
int dimension;
int * A = cargaArreglo(&dimension);
[...]
int * cargaArreglo(int * retDimension){
int i = 0;
char bandera = 's';
int * B = malloc( 1*sizeof(int) );
while( bandera != 'n' ){
printf( "Ingrese un numero" );
scanf( "%d", &B[i] );
printf( "Desea seguir ingresando?" );
i++;
fflush( stdout ); /* fflush( stdin ) is UB */
scanf( "%c", &bandera );
if( bandera != 'n' )
B = realloc( B, (i+1)*sizeof(int) );
}
*retDimension = i;
return B;
}
I mean, the teacher said that is impossible, because without the double pointer I cant change the value of the global variable. This made me confuse respect to the pointers.
老师的意思是,当你在C中调用一个函数时,每个参数的一个临时副本被压入栈中,供函数内部使用。因此,如果您在被调用函数中更改参数的值,它不会在调用函数中更改回该值...例如,运行此代码:
void foo(int x, int * A)
{
x = 6;
A = NULL;
}
int x = 5;
int * A = &x;
printf("BEFORE x=%i A=%p &x=%p\n", x, A, &x);
foo(x, A);
printf("AFTER x=%i A=%p &x=%p\n", x, A, &x);
... 将打印出:
BEFORE x=5 A=0x2345678 &x=0x2345678
AFTER x=5 A=0x2345678 &x=0x2345678
...也就是说 foo() 实际上并没有改变调用函数中 x 或 A 的值,因为 foo() 只修改了传递给它的 x 的副本和 A 的副本,而不是原始变量。
但是,foo() 可以使用 A 指针(间接)修改调用函数的 x 的值,因为函数的 A 副本仍然指向调用函数的 x,因此您可以实现foo 这样做:
void foo(int * A)
{
*A = 666;
}
int x = 5;
printf("BEFORE x=%i\n", x);
foo(&x);
printf("AFTER x=%i\n", x);
...你会得到这个输出:
BEFORE x=5
AFTER x=666
... 如果上面的内容对你有意义,那么指针到指针的情况实际上与上面的一样,除了 A 指向一个 int,而不是指向一个 int,它的值的类型指向的是一个指针:
void foo(int ** x)
{
*x = NULL;
}
int y = 5;
int * x = &y;
int ** A = &x;
printf("BEFORE x=%p\n", x);
foo(A);
printf("AFTER x=%p\n", x);
... 会打印出:
BEFORE x=0x2345845 (actual value will vary depending on your computer)
AFTER x=NULL
关于c - 在 C 中使用双指针查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37301901/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!