我们可以通过写int *来声明一个指向整数的指针。我们已经看到了一个指针类型char ** argv。这是指向字符的指针。
似乎argv是指向多个指向chars的指针的指针。
在C中,字符串由指针类型char *表示。在引擎盖下,它们存储为一个字符列表,最后一个字符是一个特殊字符,称为空终止符。
上面的char **情况是这样吗,其中指针作为字符存储在字符串中?
答案 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*
这发生在内存中:
答案 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
因此您可以在内存中构造任何指针层次结构。