指针与数组名的区别

原文: C 数组

   Jiangang

指针与数组名的区别

指针:也是一个变量,存储的数据是地址。

数组名:代表的是该数组最开始的一个元素的地址。

int a[10];
int *p;
p = &a[0] // 可以写成 p = a;
  • 对数组元素 a[i]的引用也可以写成*(a+i)这种形式。
  • 赋值语句  p=&a[0] 也可以写成下列形式: p=a。
  • p 是个指针,p[i]与*(p+i)是等价的。

区别:指针是一个变量,可以进行数值运算。数组名不是变量,不可以进行数值运算。

更多解析

  HBR1

指针与数组的区别

char *str="Hello";
char arrgs[]="Hello";

字符数组:

char *p=(char*)&arrgs == char *p=arrgs ;
char *p=(char*)(&(arrgs[0])) == &arrgs == arrgs;

字符串指针:

char *p=(char*)&str != str; str==str[0] =='H'

得出结论字符数组的 首地址可以用 arrgs ,&arrgs,来表示并且它们相等,

但是指针&str和str是不同的,当遇到字符串指针时候要注意处理方式;

  chrislee

数组和指针的关系

  1. 函数的参数中 数组类型参数 int a[]本质是指针 可以直接换成 int *a;
  2. 可以用数组的运算符[]进行运算,而且可以通过a[0]就直接修改了外面的数组元素;
  3. size of(a) == sizeof(int *) 所以函数内部没法用sizeof得到数组的长度 只能传一个len;
// 一个整型数组的指针,长度为 len, 得到数组中的最小值和最大值 ———— 从外部传入两个指针,从而将所求的两个结果保存带出来,得到多个返回值。
void minMax(int a[], int len, int *min, int *max) {
    int i;
    
    *min = *max = a[0]; //假定最大值 最小值相等 为a[0]  
    
    for(i= 1; i < len, i++) {
        if( a[i] < *min) {
          *min = a[i];
        }
        
        if(a[i] > *max) {
          *max = a[i];
        }
    }

}

int a[] = {1, 2, 3, 4, 5, 7, 8, 9, 15, 18, 25, 33};
int min, max;
minMax(a, sizeof(a)/ sizeof(a[0]), &min , &max );
printf( "min = %d, max = %d \n",  min,  max);
  • 数组变量是特殊的指针,数组变量本身表达地址,int a[10];   int *p =a;
  • 数组变量无需用取址符& ;
  • 数组的元素表达的是变量,需要用&取地址,如 m = &a[0];
  • []运算符可以对数组做,也可以对指针做 p[0] == a[0];
  • *运算符可以对指针做,也可以对数组做 *a = 25, *a可以得到或者修改数组首个元素的值;
  • 实际上数组是 const 的指针,所以不能被赋值。 如果 int a[] = {1,2,5,7}int b[],由于 int b[]实质上等价于 <===> int const *b;    b 是一个常数,不能被改变,初始化出来代表这个数组就不能再改变。 b = a; (错误) 数组变量之间是不可以这样互相赋值的。 而 int *q = a; 这样是可以的。