-
子函数中定义的通用指针变量会在子函数结束后自动释放,如果返回这样的局部指针变量,调用方一般无法正确读取指针地址中的数据。
因此,如果要在 main 函数中输出自定义函数中定义的数组,则需要在自定义函数中将数组定义为静态数组,然后返回数组名称。
静态变量的生命周期是整个程序的生命周期,从定义开始,直到程序结束才发布。
#include
char *get str(void) 返回 type 值作为字符指针。
static char str[100]=;静态变量的初始化在定义时仅执行一次,并且仅执行一次初始化。
sprintf(str,"hello world");
return str ;
void main()
char *p;
p=get_str();
printf("%s", p );
-
函数的返回值由函数的定义确定。
对于要返回指针的函数,应在函数定义中将返回值指定为指针,以便函数返回指针。
如果函数返回的指针指向的是一维数组,那么在函数运行时应该将指针指向该数组,这样函数才能返回指向一维数组的指针,同时也要注意函数运行后是否释放了一维数组的内存。
-
int* pi()
static int a = ;
int* p = a;
return p;
指针不是仍然是指针吗,指针按原样返回。
-
int (*func())3] fun 是一个函数,它返回指向具有三个 int inter 的 intent 数组的指针。您需要使用子函数中的 malloc 函数来为此指针分配内存。
-
答案:1如何声明一个指向整个 n 个元素数组的指针,每个元素都是 int,不是 int (*p)[n],而是最简单的 int*p;
2.如何声明一个指针,该指针也指向一个有 n 个元素的数组,每个元素都不是 int,而是一个指针 int*; 此指针为 int**p;
3.你如何声明一个指向另一个指针的指针,这个“另一个指针”指向一个数组,数组元素是一个 int; 此指针仍为 int**p。
-
2.那么,你如何声明一个指针,它也指向一个有 n 个元素的数组,每个元素都不是 int,而是一个指针 int*;
指针数组,int *arrayint[n];
指针 int *(p)[n];
3.你如何声明一个指向另一个指针的指针,这个“另一个指针”指向一个数组,数组元素是一个 int;
数组 int array[n];
int **p;
-
2, int *(p)[n];其中: int *[n]; 是指针数组,(*p) 是它的指针。
3 int (*p)[n];其中 int [n] 是普通的 int 数组,(*p) 是它的辅助指针。
-
p=&a;它是 = 符号两侧的类型匹配。 因为 p 被声明为指向具有 4 个元素的一维整数数组的指针,而 a 被定义为指向整数数组的第一个元素的指针,所以它被写成 p=a; 等号两边的类型不匹配,甚至连编译都无法传递。 &a 是指向具有 4 个整数元素的一维数组的指针 - 即在 int a[4]=; ,a 是 1 的地址,a+1 是 2 的地址; 虽然 &a 的值与 a 相同,但 &a 是整个数组的地址,但 &a+1 指向 7 之后的单元格。
而 int (*p)[4]; 这个语句正是 &a 的意思,即 p 是指向 4 元素整数数组的指针,即 p+1 跳过了 4-int 元素占用的空间。
printf("%d",(*p)[3]);(*p)[3] in 的意思是这样的:p=&a;,p 的地址 “value” 是 1 的地址 “value”,但它表示存储在 1、3、5 和 7 旁边的 4 个 int 数的第一个地址,在 *p 之后是第一个元素 1 的地址,然后 (*p)[3] 将 3 个元素的位置向后移动,应该是 7 ......这里 *p 用 () 括起来,因为优先级高于 *,如果不封装,就会被解释为 *(p[3]),这意味着一个很大的错误!
这里涉及的指针操作有点“缠绕”,要慢慢体验......
-
在这里写 p=a 是可以的。 因为数组的定义是 int a[4],而 a 表示数组所在的内存地址,所以 p=a 实际上等价于 p=&a,你试着用 p=a 替换它,结果还是 7
感谢您领养
-
int **p 是指向 int* 的指针,int(*p)[10] 是指向数组的指针。
-
由于 int **p 定义是指向 int* 类型的指针,因此在楼下所说的 int **p。
int (*p)[10] 是一个指向长度为 10 的数组的指针
如果定义为 deal(int **p),则应使用参数来加强类型转换:deal((int**)a);
而且用 p 的时候不能用下标,p[2][3] 就错了,因为你不知道 p 指向的 int* 类型的长度,也编译成 *(p+2*10+3)。
您必须编写 *(p+2*10+3) 才能调用它。
如果它被定义为 deal(int (*p)[10]),则情况并非如此,并且编译器将知道 p 是指向长度为 10 的数组的指针。
然后 p[2][3] 将被编译为 *(p+2*10+3)。
简而言之,C 语言非常灵活,不同的定义和不同的用法可以得到正确的结果。
不知道房东懂不懂?
还有多维数组与多维指针的问题,房东可以自己做个类比。
-
首先,你要明白数组名称和指针本质上是一回事,它们都是地址,数组的第一个地址。 一旦你知道了这一点,你就可以学习并付诸实践。 这就是C语言的精髓。
例如,定义 int *p,a[10]; 并设 p=a; 这个操作称为指向数组 a 的指针 p,其本质是给变量 p 支付一个值,即数组 a 的地址、a[0] 的地址以及存储在 a 本身中的内容。
所以引用 a[i],你可以用多种方式写它,比如 *(a+i), p+i), p[i],所有这些都是等价的。
p++ 的意思不是 p=p+1,至少有时候不是,p++ 的运算其实是指向 p 指向下一个元素,即 p 指向 a[0],所以现在 p 指向 a[1]。 由于 a 是一个 int 类型并且代表 4 个字节,因此操作 p++ 实际上将 p 的内容加 4。 不要问为什么,这是C规定的。
如果 p 指向 char 类型,则 p++ 将 p 的值增加 1。
-
如果要表达a[i],最常用的a[i]也可以是*(a+i),或者*(p+i)c语言规定:表达式1[表达式2]完全等价于*(表达式1)+(表达式2)),也可以说a[b]和b[a]也是完全等价的,也就是说a[i]和i[a]也是完全等价的, 你可以试试。
-
*p *a p=a 表示数组的第一个地址分配给指针 P,以便指针指向数组,p++ 表示指针 p 地址加 1,使其指向下一个地址。
-
a[i] 可以表示为: *(a+i) a[i] 我只记得这两个。
p=a 表示数组中第一个带有 p 的地址,指针指向该地址。
p++ 表示 p 指针指向其下一个元素 例如,如果 p 指向 a[i],则 p++ 指向 a[i+1]。
-
一个""或"*",这是一个数组。
二""或"*",是变量,包括组合。
a 是二维数组或数组指针。
所以:变量是:1 9
一维指针为:2 5 7 8
数组指针为:3 4 6
-
1数组指针强调它是一个指针,这个指针指向一个数组,给这个指针数组名称就是给数组指针赋值。
2 二维数组中每个元素是什么,取决于你定义二维数组的类型,例如:char num[3][3],数组中的每个元素都是 char 类型的一大块内存,可以存储 char 类型的数据。 二维数组的名称是整个二维数组的第一个地址,a=&a[0]=&a[0][0]=a[0]=a[0]的值是二维数组的第一个地址的值。
指针数组的名称是一块开放内存的第一个地址,它是一个常量,如a[0],它指向数组的第一个内存区域,并且可以分配内存区域,理解。
char *ss[6];ss[1]="right?"这句话首先定义了一个 char 类型的指针数组,强调它是一个数组,其中的元素是指针,指针指向 char 类型的数据,ss[1] 是指针数组的第二个元素,是指针,指针指向“右”字符串的第一个地址。
char ss[6][20];ss[1]="right?"就是定义一个二维字符数组,6个横向,20个长,起到混淆作用! 在二维数组中,ss[0]、ss[1]等表示第一行和第二行,ss[0][3]是第一行的第四个元素,ss[1][3]代表第二行的第四个元素。
3.第三个问题是再用我一次,你可以换个职业!! 哈哈哈。
祝你学习好运!!
递归实际上是“函数的自我调用”。
在这个“自调用”过程中,必须有一个变化的“参数”,当这个“参数”达到你想要的值时,“自调用”过程就终止了。 >>>More
VC**中可以生成一些接口,可以参考,也可以参考MSDN。 这不是一个可以在这里说的问题,因为它需要很多话才能完成。 这不是你能在一两天内学会的东西。 强烈建议您查看有关此主题的书籍。