2016-06-13 73 views
0

我是C/C++编程新手,我仍然在学习指针数据类型之间的一些差异。但我在努力与这些中的一个:指针数据类型之间的区别C

int *const x1; 
const int *x2; 
char *x3[3]; 
char (*x4)[3]; 
double* x5, x6; 

我第一个想到的应该是一个整数变量指向一个常量内存地址
x2应该是一个整数指针,它是const的,对不对?

我不知道这是否正确。那么任何人都可以解释他们之间的差异吗?

+0

注意:'int * a'是一个指针,'int a [2]'也是一个指向2个值的指针(数组)。 'int * a [2]'是一个指向数组的指针。它可能会帮助你理解 – Hearner

+1

@Hearner:'int a [2]'是**不是**指针(尽管在某些情况下它可能会衰减*)。 –

+1

@Hearner'int * a [2]'是一个指针数组。 –

回答

3
int *const x1; // const pointer to int 
       // x1 is const pointer, so it cannot point to anything else (once initilized), 
       // but what it points to can changed 

const int *x2; // pointer to const int 
       // x2 can points to something else, 
       // but what it points to cannot be changed 

char *x3[3]; // array of three pointers to char 
       // (array of pointers) 

char (*x4)[3]; // pointer to array of three char 
       // (single pointer) 

double* x5, x6; // x5 is pointer to double, x6 is just a double 
+1

最后一个例子不应该这样写。 “*”属于变量名称,因此星号应该与其他声明的名称一样。 – Olaf

2

对于此类问题,您可以使用cdecl进行检查,例如,关于第三个例子:

char *x3[3]; 

cdecl回报:

声明X3作为指针的阵列3到char

为您第四示例:

char (*x4)[3]; 

cdecl返回:

声明X4作为指针炭

+1

cdecl不能用于多个声明(例如'double * x5,x6;')。 – Holt

+3

@霍尔特:真的 - 你需要运用一点常识来解决这个问题,并且不会被'*'的关联性所困扰 - 我没有打算为所有的操作系​​统完成他的作业。 ;-) –

+1

感谢您访问本网站。 不知道有这样的事情。 – Velox

2

的阵列3您READ C向后声明符。因此,“int * const”是一个指向int的常量指针(你可以改变int,但不能在初始化之后将指针指向其他地方);而“const int *”是一个指向常量int的指针(改变指针所有你喜欢的,但不是它所指向的int)。

“C语句的语法是一个失败的实验。”根据Bjarne Stroustrup。

2
int *const x1; 

恒定指针int,这意味着指针不能被改变为指向任何东西。

const int *x2; 

指向int常数。这里的整数是恒定的,这意味着你不能改变这个值。

char *x3[3]; 

阵列(长度3)的指针到char

char (*x4)[3]; 

指针炭(长度为3的)的阵列

double* x5, x6; 

x5是指针翻一番,x6是只是一个double变量

相关问题