C语言数组和指针

一维数组

int arr[6]={1,2,3,4,5,6};//一维数组初始化

int array[6]={[5]=222};其他元素位置没有初始化,会被初始化为0

#include<stdio.h>
#define MONTHS 12
int main(void){
    int day[MONTHS]={31,28,[4]=31,30,31,[1]=29};
    int x[20];
    int y;
    for (int i = 0; i < MONTHS; i++)
    {
        printf("%2d %d\n",i+1,day[i]);
    }
    for(y = 0;y<20;y++){
        x[y]=2*y;//给数组进行赋值
    }
    
   return 0;
}

多维数组

float xx [3][[4]={(1,2,3),(1,2,3),(1,2,3),(1,2,3)};

int yy[3][4][5];//三维数组也类似。

指针

指针是存放地址的变量

int *a;// 声明一个 int 类型的指针 a

char *a;// 声明一个char类型的指针 a

int *arr[10];// 声明一个指针数组,该数组有10个元素,每个元素都是指向Int类型的指针

int (*arr)[10];//声明一个数组指针,该指针指向一个Int类型的一维数组

int **a; // 声明一个指针a,该指针指向一个 int 类型的指针

struct Student *p_struct;//结构体类型的指针

int *x;

int y = 1;

x=&y;

x=(int *)mallco(sizeof(int)*n);//动态分配内存

相同类型的指针变量可以互相赋值。

空指针,是指向空,或者说不指向任何东西。x=NULL代表空指针情况。

*x代表x中存储的地址对应的存储单元中的数据.//1

#include<stdio.h>

int main(void){
        int x = 1;
        int *i= &x;//指向一个int类型的指针变量
        char y = 'a';
        char *u = &y;
        printf("%d\n",sizeof(i));//64位系统指针大小8byte,并且固定
        printf("%d\n",sizeof(u));//64位系统指针大小8byte,并且固定
        printf("%p\n",&i);//000000000061FE08 指针本身的地址
        printf("%p\n",&x);//000000000061FE14 指针存放的值 
        printf("%p\n",i);//000000000061FE14指针存放的值
        printf("%p\n",i+1);//000000000061FE18  指针i+1=指针i+sizeof(指针类型)*1;

        int arr[3]={1,5,3};
        int *p;
        p=arr;
        /*
        arr本身的地址,arr首元素的地址,以及arr本身地址是相同的
        arr代表一个地址,并且是arr数组首元素的地址,
        数组与指针不同点是:
        数组名取地址得到的是数组名所指元素的地址。
        对指针取地址得到的是指针变量自身的地址。
        数组名就是一个指向数组首元素类型的常量指针,也就是说数组名是不允许更改的,而指针可以更改。
        数组名是常量指针,指针是变量指针。
        */
        printf("%p\n",arr);//000000000061FDF8
        printf("%p\n",&arr[0]);//000000000061FDF8
        printf("%p\n",&arr);//000000000061FDF8
        /*当对数组名使用sizeof时,得到的是数组元素的个数乘元素类型的字节数,
        对指针sizeof得到的是指针类型的字节数。
        */
        printf("%d\n",sizeof(arr));//12  3*4
        printf("%d\n",sizeof(i));//8 指针类型的字节数
        /*
        对arr取地址后加1后,增大了12个字节,而对指针p取地址后加一,
        只增大了8个字节,所以说它们取地址后加一的能力不同。
        */
        printf("%d\n",&arr);//6422008
        printf("%d\n",&arr+1);//6422020
        printf("%d\n",&i);//6422024
        printf("%d\n",&i+1);//6422032
        /*
        总结:
        1.数组名代表了一个指向数组首元素的常量指针,一经定义,不可更改,数组名作为常量指针,其类型与数组元素类型相同。指针是变量指针,定义之后仍可更改,其类型在定义时确定。
        2.当出现sizeof,和&操作符时,数组名不再当成指向一个元素的常量指针来使用,而指针仍当成指向一个元素的变量指针来使用。
        */
       /*
       *(i+1)与*i+1
       */
      printf("%d\n",*(p+1));//5 *(p+1)=arr[1]
      printf("%d\n",*p+1);//2 *p+1=arr[0]+1
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值