int a[]={1,2,3,4,5,6},*p=a,i=3; 则a[p+a]正确吗
时间: 2024-04-07 12:24:22 浏览: 28
根据提供的引用内容,a是一个数组,p是指向a数组的指针,i是一个整数。在C语言中,数组名a代表数组的首地址,即a的地址。因此,a[p+a]是不正确的写法,因为p是指向a数组的指针,p+a代表的是a数组中的第p+a个元素,而不是地址。正确的写法应该是*(p+a),它代表的是a数组中的第p+a个元素的值。
```c
int a[] = {1, 2, 3, 4, 5, 6};
int *p = a;
int i = 3;
printf("%d", *(p + i)); // 输出:4
```
相关问题
如何理解这行代码int a = 10;int *p1 = &a;int **p = &p1;
这行代码定义了一个整型变量a,其值为10。接着定义了一个指向a的指针变量p1,它的值为a的地址。最后,定义了一个指向指针变量p1的指针变量p,它的值为p1的地址。
我们可以通过p1来访问a的值,例如*p1就表示a的值。而通过p,我们可以访问p1的值,例如*p就表示p1的值,即a的地址。同时,通过**p,我们也可以访问a的值,例如**p就表示a的值。
这样的多级指针在动态内存分配和二维数组等场景下非常有用。例如,我们可以使用双重指针来动态分配一个二维数组,如下所示:
```
int **p;
int n = 3, m = 4;
p = (int **)malloc(sizeof(int*) * n);
for (int i = 0; i < n; i++) {
p[i] = (int *)malloc(sizeof(int) * m);
}
```
这里,我们先分配一个指向指针变量的指针p。然后,我们通过循环分别为每个指针变量分配一个整型数组,从而动态分配了一个n行m列的二维数组。
下列关于指针的用法中错误的是( )。 A. int i,*p; p =&i; B. int *p; p = NULL; C. int i,*p=&i; D. int i = 5,*p; *p = &i;
### 回答1:
&i;
B. int i=10,*p=&i;
C. int i=10,*p; *p = &i;
D. int i=10,*p; p = i;
在这里,错误的是 C 选项。在 C 选项中,*p 尝试去赋值 &i,但是 *p 是一个指针变量,而 &i 是 i 变量的地址。因此,不能将 &i 赋值给 *p。
正确的用法应该是将 p 赋值为 &i,然后使用 *p 来访问 i 变量的值。例如:
int i = 10, *p;
p = &i;
*p = 20; // 现在 i 的值为 20
另外,A 选项是正确的,B 选项也是正确的,D 选项是错误的。在 D 选项中,p 尝试赋值 i,但是 p 是一个指针变量,而 i 是一个整数变量。因此,不能将 i 赋值给 p。
### 回答2:
&i; *p= 10; B. int a[5]; int *p = a; C. int i; int *p = &i; D. int a[5]; int *p = &a;
### 回答3:
&i; B. int *p,i; p = &i; C. int *p,i; *p = &i; D. int i,*p; *p = 10; 正确答案是:C. int *p,i; *p = &i;
解释:C选项中,指针p未被初始化,不能直接将地址&i赋给*p。应该先为指针p分配内存空间,然后再将地址赋给它。正确写法应该是 int *p,i; p = &i; *p = 10;