单个指针可以指向C中的多个指针吗?

时间:2018-07-23 15:25:58

标签: c pointers debugging unix

我们可以通过写int *来声明一个指向整数的指针。我们已经看到了一个指针类型char ** argv。这是指向字符的指针。

似乎argv是指向多个指向chars的指针的指针。

在C中,字符串由指针类型char *表示。在引擎盖下,它们存储为一个字符列表,最后一个字符是一个特殊字符,称为空终止符。

上面的char **情况是这样吗,其中指针作为字符存储在字符串中?

5 个答案:

答案 0 :(得分:3)

指针可以指向单个对象,也可以指向对象数组。

FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':metafix'. > invalid code lengths set ... * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':metafix'. ... Caused by: org.gradle.api.GradleException: invalid code lengths set at net.corda.gradle.jarfilter.Utils.rethrowAsUncheckedException(Utils.kt:25) ... Caused by: java.util.zip.ZipException: invalid code lengths set at kotlin.io.ByteStreamsKt.copyTo(IOStreams.kt:101) 的{​​{1}}参数被声明为argv的情况下(由于它是一个函数参数,因此等效为main),它是指向的指针。 char *argv[]的数组。

在内存中看起来像这样:

char **

答案 1 :(得分:3)

例如,当我们定义<your-project-root>/local.properties时:

示例1:

char *argv[]

示例2:(这里有char *p[5] = {{"ali"}, {"reza"}, {"hamid"}, {"saeed"}, {"mohsen"}}; for(int i = 0;i < 5;i++) printf("%s\n", *p[i]); 个指针指向5

char*

这发生在内存中:

enter image description here

答案 2 :(得分:2)

是的

指向p的指针T可以指向单个T,或者指向T数组的。在后一种情况下,您可以使用诸如p[n]之类的指针算法来索引数组。同样,argv[n]的指针不是单个的char,而是char的n终止数组,也就是C风格的字符串。

答案 3 :(得分:1)

指针是对内存地址的引用-指针包含变量的地址。指向指针的指针是一种间接形式,其中指针包含指向另一个指针变量的地址。第二个指针变量包含存储值的地址。

argv表示参数向量,该参数向量通过命令行将对参数的引用传递给程序。指针argv指向字符数组中的第一个元素;现在,由于向量表示为数组,因此可以隐式查找其他指针。

答案 4 :(得分:0)

Memory-Address:  |0xA0|0xA1|0xA2|0xA3|0xA4|0xA5|0xA6|0xA7|
Memory-Content:  |        0x123      |       0x456       |
                 |-------4-Byte------|
                 |<- int* = 0x123

C中的指针包含内存中特定区域的地址(忽略VirtualMemory)。 纯地址标记起始位置(此处为0xA0),范围受实际C类型的大小限制。

但是内容也可以是指针。 (这里只有32位地址!)

Memory-Address:  |0xA0|0xA1|0xA2|0xA3|0xA4|0xA5|0xA6|0xA7|
Memory-Content:  |        0xA4       |        0x123      |
                 |-------4-Byte------|
                 |<- int** = 0xA4    |<- int* = 0x123

因此您可以在内存中构造任何指针层次结构。