- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始学习 C,发现很难理解指针概念。
我遇到过这个代码示例。
下面这句话是什么意思?字符 *s_item[20];
我知道 char *s_item 表示字符指针,您需要先为其分配内存,然后才能将字符串分配或复制到其中。它只存储字符串的起始地址。
接下来,这句话是什么意思。s_item=(char(*)20)calloc(30,20);
最后有人可以向我解释一下 char **values 的概念吗我知道它是一个指向指针的指针。但我们到底可以在其中存储什么样的值呢?它是字符串的集合吗?
最佳答案
如果您了解 the spiral/clockwise rule,您可以将其解读为包含 20 个指向 char
的指针的数组。 IE。字符串数组。
根据定义的位置,每个元素要么是空指针(如果它是全局变量),要么每个元素都未初始化并具有不确定值(如果s_item code> 是局部变量)。无论哪种方式,您都必须使数组中的每个指针指向一些有效数据,然后才能真正使用它们,方法是使它们指向现有字符串或动态分配内存然后初始化。
<小时/>
对于指向指针的指针,它与任何其他指针相同:它是一个指向某物的指针,在本例中它指向另一个指针。
示例:
char *p = malloc(12); // Allocate 12 bytes and make the variable p point to it
strcpy(p, "hello world"); // Initialize the memory we just allocated with a string
char **pp = &p; // Make the variable pp a pointer, and make it point to the variable p
在内存中它看起来像这样
+----+ +---+ +---------------+| pp | --> | p | --> | "hello world" |+----+ +---+ +---------------+
That is, pp
is pointing to the variable p
, and p
is pointing to memory containing the string "hello world"
.
The example shown above, having pp
is pretty much useless, but with pointers to pointers you can emulate pass by reference with function arguments, and for example do something like this:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void function(char **pp)
{
*pp = malloc(12); // Allocate memory
strcpy(*pp, "hello world");
}
int main(void)
{
char *p; // Define variable, but don't initialize it
function(&p); // Pass a pointer to the variable p
printf("p = \"%s\"\n", p); // Will print p = "hello world"
}
通过将变量
).p
的指针(使用&p
)传递给函数,函数可以修改指针(即p
的值)
指针到指针的另一个用途是动态数组数组。例如
char **pp = malloc(5 * sizeof(char *)); // Allocate space for five pointers to char
for (size_t i = 0; i < 5; ++i)
{
pp[i] = malloc(12); // Allocate space for a string
strcpy(pp[i], "hello world"); // Initialize the memory
}
现在我们有一个动态分配的数组,由五个动态分配的 12 个字符的数组组成。
指向指针的指针的两种用法当然都适用于 char
之外的其他数据类型。
应该注意的是,即使数组自然地衰减为指向其第一个元素的指针,但数组的数组(例如 char x[20][20]
)不是 与指向指针的指针相同(例如 char **
)。有关对此的解释,请参见例如this old answer of mine。
关于C 指针概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44481932/
我刚接触 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 *
指针, C语言的精髓 莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA). 什么是指针 保存变量地址的变量叫做指针. 这是大概的定义, 但是Defad认为
我得到了以下数组: 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
我是一名优秀的程序员,十分优秀!