C语言 --- 一维数组名的理解

简介: C语言 --- 一维数组名的理解

1、两种情况下,一维数组不是指向数组首元素地址的指针

1.  int arr[5] = { 1, 2, 3, 4, 5 };
2. 
3.  //除了两种特殊情况下,一维数组名称都是指针首元素的地址
4.  //特殊情况1: 对数组名称 进行sizeof
5.  printf("sizeof arr = %d\n", sizeof (arr));    //20
6. 
7.  //特殊情况2: 对数组名称 取地址
8.  //int * p =  &arr; //这里会报错,因为p的类型时int *, arr的类型时int (*)[5]
9.  printf("%d\n", &arr);
10.   printf("%d\n", &arr + 1);   //可以看到两次输出的地址相差20,也就是整个数组的大小

这里看一个经典的题目, 数组名a与&a的理解

1. #include <stdio.h>
2. 
3. int main()
4. 
5. {
6. 
7.     int a[5]={1,2,3,4,5};
8. 
9.     int* ptr=(int*)(&a+1);
10. 
11.     printf("%d,%d",*(a+1),*(ptr-1));
12. 
13. 
14.     system("pause");
15. 
16. return 0;
17. }

答案:2,5

解析:

int* ptr=(int*)(&a+1);&a为数组a的首地址,对指针加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1,所以&a+1则为&a的首地址加5*sizeof(int),显然当前指针已经超过了数组的界限。将上一步计算出来的地址,强制转换成int*类型,赋给ptr。

*(a+1);a,&a的值是一样的,但意思不一样。a是数组首元素的首地址,也就是[0]的首地址,a+1是数组下一个元素的首地址,即a[1],&a+1是下一个数组的首地址。所以输出2

*(ptr-1);因为ptr是指向a[5],并且ptr是int*类型,所以*(ptr-1)是指向a[4],输出5。

 

2、除了两种特殊情况外,都是指向数组中首元素的地址的指针

1.     int * p = arr;
2.     p = p + 3;
3.     // []里面可不可以放负数  可以!!
4.     printf("%d\n", p[-1]);
5.     printf("%d\n", *(p - 1));

从这个例子中也可以看出,访问数组元素的时候,下标可以是负数

 

3、数组名--- 指针常量,指针的指向不可以修改

int arr[] = {1, 3, 5, 7, 9};                   //数组名做指针的解读的时候,int * const arr;

 

4、int[] 与int *是等价的

1. void printArray( int arr[], int len )// int arr[] 等价于  int * arr
2. {
3.  for (int i = 0; i < len;i++)
4.  {
5.    //printf("%d\n", arr[i]); // 给人看
6. 
7.    printf("%d\n", *(arr + i)); //给机器看
8. 
9.  }
10. 
11. }

 

相关文章
|
6月前
|
存储 程序员 C语言
C语言:数组名
C语言:数组名
|
6月前
|
C语言
C语言-----一维数组&&指针
C语言-----一维数组&&指针
38 0
C4.
|
6月前
|
存储 程序员 数据处理
C语言怎样定义和引用一维数组
C语言怎样定义和引用一维数组
C4.
69 0
|
1月前
|
存储 编译器 C语言
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
|
1月前
|
编译器 C语言
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
|
5月前
|
C语言
【C语言刷题每日一题】一维数组的交换
【C语言刷题每日一题】一维数组的交换
|
5月前
|
网络协议 C语言 C++
C语言的数组名是什么
C语言的数组名是什么
|
6月前
|
存储 C语言 索引
C语言一维数组与二维数组详解及代码实例
C语言一维数组与二维数组详解及代码实例
65 0
|
6月前
|
存储 安全 C语言
C语言指针与一维数组的关系深度解析
C语言指针与一维数组的关系深度解析
54 0
|
6月前
|
存储 C语言 索引
C语言一维数组的定义与初始化技术详解
C语言一维数组的定义与初始化技术详解
117 0