在C语言中,带有两个星号(**)的变量声明是什么意思?
我和C一起工作,我有点生疏了。我知道在C语言中,带有两个星号(**)的变量声明是什么意思?,c,pointers,C,Pointers,我和C一起工作,我有点生疏了。我知道*有三种用途: 声明一个指针 取消对指针的引用 倍增 但是,当变量声明前有两个星号(**)时,这意味着什么: char **aPointer = ... 谢谢 Scott它声明了一个指向char指针的指针 此类指针的用途是执行以下操作: void setCharPointerToX(char ** character) { *character = "x"; //using the dereference operator (*) to get the
*
有三种用途:
**
)时,这意味着什么:
char **aPointer = ...
谢谢
Scott它声明了一个指向
char
指针的指针
此类指针的用途是执行以下操作:
void setCharPointerToX(char ** character) {
*character = "x"; //using the dereference operator (*) to get the value that character points to (in this case a char pointer
}
char *y;
setCharPointerToX(&y); //using the address-of (&) operator here
printf("%s", y); //x
下面是另一个例子:
char *original = "awesomeness";
char **pointer_to_original = &original;
(*pointer_to_original) = "is awesome";
printf("%s", original); //is awesome
对数组使用**
:
char** array = malloc(sizeof(*array) * 2); //2 elements
(*array) = "Hey"; //equivalent to array[0]
*(array + 1) = "There"; //array[1]
printf("%s", array[1]); //outputs There
数组上的[]
运算符基本上对前面的指针执行指针运算,因此,对数组[1]
的求值方法如下:
array[1] == *(array + 1);
这是数组索引从0
开始的原因之一,因为:
array[0] == *(array + 0) == *(array);
这是指向
char
的指针。这意味着aPointer
指向char指针
所以
其用法的一个示例是创建c字符串的动态数组
char**aPointer=(char**)malloc(num_字符串)代码>
aPointer为您提供了一个字符,可用于表示以零结尾的字符串
*aPointer = (char*)malloc( string_len + 1); //aPointer[0]
*(aPointer + 1) = (char*)malloc( string_len + 1); //aPointer[1]
C和C++允许使用指向指针的指针(比如说五次快)。请看下面的代码:
char a;
char *b;
char **c;
a = 'Z';
b = &a; // read as "address of a"
c = &b; // read as "address of b"
变量a
包含一个字符。变量b
指向内存中包含字符的位置。变量c
指向内存中包含指针的位置,该指针指向内存中包含字符的位置
假设变量a
将其数据存储在地址1000处(注意:示例内存位置已完全组成)。假设变量b
将其数据存储在地址2000,变量c
将其数据存储在地址3000。考虑到所有这些,我们有以下内存布局:
MEMORY LOCATION 1000 (variable a): 'Z'
MEMORY LOCATION 2000 (variable b): 1000 <--- points to memory location 1000
MEMORY LOCATION 3000 (variable c): 2000 <--- points to memory location 2000
内存位置1000(变量a):'Z'
内存位置2000(变量b):1000它将aPointer
声明为指向char的指针
C语言中的声明以表达式类型为中心;它的通用名称是“声明模仿使用”。作为一个简单的例子,假设我们有一个指向int的指针,名为p
,我们想要访问它当前指向的整数值。我们将使用一元*
运算符取消对指针的引用,如下所示:
x = *p;
表达式*p
的类型是int
,因此指针变量p
的声明是
int *p;
char **aPointer;
在这种情况下,aPointer
是指向char的指针;如果我们想获得它当前指向的字符值,我们必须取消对它的引用两次:
c = **aPointer;
因此,按照上面的逻辑,指针变量aPointer
的声明是
int *p;
char **aPointer;
因为表达式**aPointer
的类型是char
为什么会有指向指针的指针?它出现在多个上下文中:
- 您需要一个函数来修改指针值;一个例子是
strtol
库函数,其原型(从C99开始)是
第二个参数是指向char的指针;调用strtol时,将指向char的指针的地址作为第二个参数传递,调用后它将指向字符串中未转换的第一个字符。
- 请记住,在大多数上下文中,“T的N元素数组”类型的表达式隐式转换为“指向T的指针”类型,其值是数组第一个元素的地址。如果“T”是“指向字符的指针”,则“指向字符的指针的N元素数组”类型的表达式将转换为“指向字符的指针”。例如:
void foo(char **arr)
{
size_t i = 0;
for (i = 0; arr[i] != NULL; i++)
printf("%s\n", arr[i]);
}
void bar(void)
{
char *ptrs[N] = {"foo", "bar", "bletch", NULL};
foo(ptrs); // ptrs decays from char *[N] to char **
}
- 要动态分配多维数组:
#define ROWS ...
#define COLS ...
...
char **arr = malloc(sizeof *arr * ROWS);
if (arr)
{
size_t i;
for (i = 0; i < ROWS; i++)
{
arr[i] = malloc(sizeof *arr[i] * COLS);
if (arr[i])
{
size_t j;
for (j = 0; j < COLS; j++)
{
arr[i][j] = ...;
}
}
}
}
#定义行。。。
#定义COLS。。。
...
字符**arr=malloc(sizeof*arr*行);
如果(arr)
{
尺寸i;
对于(i=0;i
感谢您的回复!指针指向指针的用例是什么?@Jacob-是:有效的C语法吗?我对此不熟悉。char**
也可以表示字符串列表,例如argv
或传递给execvp
或类似对象的参数列表。@Matt这是真的。我应该在这里加上一个例子。