【C语言】指针和一维数组的关系

一、指针和一维数组

1.一维数组名

  • 一维数组名是个指针常量,存放的是一维数组第一个元素的地址
int a[5];
int b[5];

a = b; //error,常量之间无法赋值

printf("%#X\n",&a[0]);
printf("%#X\n",a);     //二者相同

2.下标和指针的关系

确定一个一维数组需要2个参数

数组名数组长度

  • 如果p是个指针变量,则p[i]永远等价于*(p+i)
#include  <stdio.h>

//f函数可以输出任何一个一维数组的内容
void f(int * pArr,int len) // a是 int* 类型,所以pArr也要为 int* 类型
{
    for(i=0;i<len,i++)
    	printf("%d",*(pArr+i)); //*(pArr+i)为第i+1个元素,等价于pArr[i]
    print("\n");
}	/*如果p是个指针变量,则p[i]永远等价于(p+i)*/

int main(void)
{
    int a[5] = {1,2,3,4,5};
    int b[6] = {-1,-2,-3,4,5,-6};
    int c[100] = {1,99,22,33};
    
    f(a,5); // a是 int*类型
    f(b,6);
    
    return 0;
}
#include <stdio.h>

void f(int * pArr,int len)
{
    pArr[3] = 88; //p[i]永远等价于*(p+i)
}

int main(void)
{
    int a[6] = {1,2,3,4,5,6};
    
    printf("%d\n",a[3]); //4
    f(a,6);
    printf("%d\n",a[3]); //88,p[i]永远等价于*(p+i) 
    
    return 0;
}

3.指针变量的运算

  • 指针变量不能想加,不能相乘,也不能相除
  • 如果两个指针变量指向的是同一块连续空间中的不同存储单元,则这两个指针变量才可以相减,表示二者之间的元素的个数
#include <stdio.h>

int main(void)
{
    int i = 5;
    int j = 10;
    int * p = &i;
    int * p = &j;   // p-q,error,没有实际意义
    
    int a[5];
    p = &a[1];
    q = &a[4];
    printf("p和q所指向的单元相隔%d个单元\n",q-p);
    
    return 0;
}

4.一个指针变量到底占几个自节

预备知识:

sizeof(数据类型)

​ 功能:返回值就是该数据类型所占的字节

sizeof(数据名)

​ 功能:返回值就是该变量所占的字节

​ 例:sizeof(int)=4

  • p指向char(1Byte)类型变量
  • p指向int(4Byte)类型变量
  • p指向double(8Byte)类型变量
#include <stdio.h>

int main(void)
{
    char ch = 'A';
    int i = 99;
    double x = 66.6;
    char * p = &ch;
    int * q = &i;
    double * r = &x;
    
    printf("%d %d %d\n",sizeof(p),sizeof(q),sizeof(r));
    		//4,4,4,和编译器有关
    return 0;
}
  • 结论:

    一个指针变量,无论指向的变量占几个字节,该指针变量本身所占字节数一样大,且和编译器有关。

上一篇:简单一维数组的代码实现


下一篇:C语言——数据类型