数组与指针

一、数组

1.数组初始化:

1.1.创立数组的时候初始化,像这样:

int array[5] = {1,2,3,4,5};

int array[5] = {1,2,3};//此时array[3],array[4]都会被编译器初始化为0

int array[2] = {1,2,3};//此事3的值便会被舍去

int array[5] = {0};//全部初始化为0

int array[]  = {1,3,4...}//这样便不用担心出错了

int array[]  = {1,2,3...};
int i = sizeof array / sizeof array[0];
//i便是array数组所包含的元素多少了

1.2.使用for循环:

int array[5];
for(i=0;i<5;i++)
{
    array[i]=i;
}

1.3.但这样是错的:

int array1[5],array2[5];

array1[5]={1,2,3,4,5};//此时array1[5]是一个超出数组下标的元素,属于语法错误。

array2=array1;//C不允许这个操作,不要想着自己操作了,doge

1.4.指定初始化:

int array[5] = {[4] = 5};//将array[4]初始化为5,同样,其它未初始时化的元素为0

int array[8] = {1,2,[4]=3,4,5,[1]=6};
for (i=0;i<8;i++)
{
    printf("%2d %d\n",i+1,array[i]);
}
//打印结果:1    6
           2    2
           3    0
           4    3
           5    4
           6    5
           7    0
           8    0    1.指定元素后面的值会排在指定元素后
                     2.前面的值会被后面的指定元素替代 

1.5.奇怪的下标不可取:

int array[-1];//不行,数组大小必须大于0

int array[1.5];//不行,数组大小必须是整数
int array[(int)1.5];//可以,已经被强制初始化了

int m = 2;
int array[3];
int array[m] = 3;//C99之前不允许,现在阔以

2.多维数组

2.1.初始化多唯数组:其实就是大数组里面住着小数组

int array[2][2] = {  {1,2},{3,4}  };//2个包含两个元素的元素

int array[2][2] = {  {1,2,3},{4,5}  };//第一个元素初始化有问题,但不影响第二个元素

int array[2][2] = {1,2,3,4,5};//如果是这样,被丢的就是5

二.数组与指针

1.数组、指针:

1.1.数组的首地址:

int array[5];
array = &array[0];//数组名就是数组的首地址,两者都是常量

1.2.指针对于数组地址的移动:

1.2.1.不同变量类型

#define SIZE 5

int *ptr,*poi;
short array1[SIZE];
double array2[SIZE]
*ptr = array1;
*poi = array2;

printf("%2d %d",ptr,ptr+1);
//结果:0x7fff5fbff8dc  0x7fff5fbff8de 加的是一个short
printf("%2d %d",poi,poi+1);
//结果:0x7fff5fbff8a0  0x7fff5fbff8a8 加的是一个double

//指针加一指的是增加一个元素的储存单元,所以指针不仅需要地址,还需要类型

1.2.2.运算优先级:

#define SIZE 5

int *ptr;
short array[S1ZE];

ptr = array;
*(ptr+1) == &array[1]
*ptr+1 == array[0]+1 //因为*的优先级高于+

2.函数、数组、指针:

2.1指针的初始化

int array[5];

int *p=array;//直接将array首地址赋值给p

int *p;
p = array;//也行,不能用*p,因为*p是对p指针解引用了,而p未初始化1

2.1函数对指针的调用:

函数原型可以省略原型,但函数定义不能省略

int fun(int *ar, int n)
int fun(int ar[], int n)   
 //关于函数的形参,仅在函数原型或者函数定义中,才可以用int ar[]替代int *ar
//这里ar[]也是指向实参数组的指针

C保证在给数组分配空间时,指向数组后面的第一个位置的指针任是有效指针

int sump(int *start,int *end)
{
    int total=0;
    while(start<end)
    {
        total += *start;
        start++;
    }
    return total;
}

const *p不可改变它指向的值,但数组本身可以改变值,它自身也可以指向别处

#define M 5
const int *p;
int ar[M];
int rt[M];
p = ar;
*p = 8;//无效
ar[M] = 8;//有效
p = rt;//有效

const数组不可以赋值给普通指针

#define M 5
const int ar[M];

int *p;
p = ar;//无效

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值