双指针和指针数组之间的区别
Difference between double pointer and array of pointers
在普通的c/c ++程序中,我们将main函数编写为:
int main(int c, char **argv)
或
int main(int c, char *argv[])
这里 argv 表示一个指针数组,但我们甚至表示双指针(指针到指针(使用 **。
前任:
char p,*q,**r;
q=&p;
r=&q;
这里 r 是一个双指针,而不是指针数组。
谁能解释其中的区别?
用作函数参数时
char a[] // compiler interpret it as pointer to char
相当于
char *a
同样,在main
的签名中,char *argv[]
等同于char **argv
。请注意,在 char *argv[]
和 char **argv
这两种情况下,argv
的类型为 char **
(不是指针数组!
声明的情况并非如此
char **r;
char *a[10];
在这种情况下,r
的类型是指向char
的指针,而 a
是指向char
的指针数组的类型。
作业
r = a; // equivalent to r = &a[0] => r = &*(a + 0) => r = a
是有效的,因为在此表达式中,数组类型 a
将再次转换为指向其第一个元素的指针,因此类型为 char **
。
永远记住,数组和指针是两种不同的类型。指针和数组等效意味着指针算术和数组索引是等效的。
推荐阅读:
- 但我听说
char a[]
和char *a
一模一样。 - 为什么数组和指针声明可以作为函数形式参数互换?
argv
是一个参数,所以数组被衰减到指针,除了大小(int c
(之外没有其他方法可以区分。
当双指针和指针数组不是参数时,它们的语法有时可能看起来相似,但它们的类型不同,因此编译器为两者生成不同类型的代码。
当感兴趣的变量不是函数参数时,sizeof
将为指针到指针和指针数组提供不同的大小。
稍微相关的问题:外部声明,T* v/s T[]
看!双指针实际上是这样
存储的 让我们说
int p,*q,**r;
p=50;
让p
的地址400
(&p
是400
(如果我们编写q=p
并打印q
我们将得到400
作为答案,因为q
指的是p
的地址,*p
会50
渲染为输出,因为operator *
指的是"地址值"。现在,假设q
有地址500
(&q
输出500
(,因此当我们这样做时: r=q
r
包含值 500
并且在r
前面加上*
*r
输出应400
,因为r
呈现存储p
地址的 q
的值作为指针变量。
因此
如果在 C 程序中我们运行以下代码
int main()
{
int p,*q,**r; //assume the address of p to be 400
//assume the address of q to be 500
p=50;
q=p;
r=q;
printf("Value of p-->%d",p);
printf("nValue of q-->%d",q);
printf("nValue at address of q "in the address displayed above"-->%d",*p);
printf("nValue of r "which will be the address of q"-->%d",r);
printf("nValue of r "which will be the adddress of p-->%d",*r);
printf("nValue of r "which will be the value of p"-->%d",**r);
/*
Please change the format specifiers and replace the specifier from %d to %u in case the address value is not being displayed
*/
return 0;
}
输出
-------
p--> 的值
50 q--> 400 q
地址"在上面显示的地址"的值--> 50
r 的值 "这将是 q"-->
500 r 的值"这将是 p"的加法-->
400 r"的值,这将是 p"--> 50
通过上面的例子,我只是试图解释双指针的使用。也许你可能知道这一点 我仍然生动地说明了这一点
现在使用上面的数组示例。
看
数组已经是指针,因为它们可以被引用为 *(a+1( 或 a[1]。
因此,根据您的问题,双指针可能意味着指针数组或字符串数组。双指针表示法的使用取决于具体情况。
在您上面发布的问题中,_TCHAR**argv 或简称 char **argv 是控制台输入的字符数组,始终被接受为字符流。
在java中,我们使用类似的东西,例如public static void main(String argv[](这
清楚地表明main方法接受输入,这些输入是char数组数组(或字符串有点通用(。
希望您已经了解其中的区别。如果没有,请评论。我会向你解释的。
谢谢
- 在 const 函数中通过引用和指针返回之间的区别
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 在 Rust 中,指针和引用有什么区别?
- 在以下声明中使用指针有什么区别?
- C++指针中的这两种类型的值分配有什么区别?
- 按值和引用传递指针之间的区别?
- printf() 和 std::cout 在指针方面的区别
- *++*++ppp,*++pp[1],*++(*(1+ppp)有什么具体的区别吗?(C/C++指针问题)
- 'new'和'='与指针的区别
- 使用指针向量和非指针向量有什么区别
- 函数指针和传递指针之间的区别
- C 中的通用指针和 C++ 中的通用指针有什么区别?
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- Fortran 中的指针和C++有什么区别
- 带"new"的指针和带"&variable"的指针有什么区别
- 指针声明和间接寻址之间的区别
- 在矢量的尖括号内使用指针符号与在外部使用指针符号有什么区别
- 在C++中,a+i 和 &a[i] 在指针算术方面有什么区别?
- ->运算符和指针 * 之间的区别 (C++)
- 当返回一系列字符或指针到char文字时的区别