深度解析数组与指针(一)

数组

数组:是一组相同类型元素的集合
一维数组 :type arr_name [size]
数组创建:

int arr1[10];

int count = 10;
int arr2[count];

数组的初始化是指:在创建数组的同时给数组的内容一些合理初始值(初始化)。

int arr2[] = {1,2,3,4};
int arr3[5] = {12345}char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

注意:

1、数组能整体被初始化,不能整体赋值
2、必须把数组当做整体看,开辟空间时数组整体开辟,整体释放,数组在内存当中一定连续存放(线性存储)
在这里插入图片描述

3、数组访问可以通过下标和数组访问。

int arr[10] = {0};//数组的不完全初始化(数组中的元素被全部初始化为0)
  //计算数组的元素个数
  int sz = sizeof(arr)/sizeof(arr[0]);
//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
int i = 0;//做下标
for(i=0; i<10; i++)//这里写10,好不好?
{
arr[i] = i;
}
//输出数组的内容
for(i=0; i<10; ++i)
{
   printf("%d ", arr[i]);
}

二维数组:

//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4]
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};
//访问二维数组中的元素
int arr[3][4] = {0};
int i = 0;
for(i=0; i<3; i++)
 {
    int j = 0;
   for(j=0; j<4; j++)
  {
    arr[i][j] = i*4+j;
   }
 }
 //遍历数组中的元素
 for(i=0; i<3; i++)
 {
   int j = 0;
   for(j=0; j<4; j++)
 {
  printf("%d ", arr[i][j]);
 }
}

注意

1、二维数组在地址中也是连续存放
在这里插入图片描述
2、可以看做一维数组,数组里面的元素为一维数组。

数组名是什么?

一般情况下为数组的首元素地址
特例:1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一 个数组名,数组名表示整个数组。
2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

数组作为函数参数

数组作为函数参数时会降维,降维其指向其内部元素类型(可能是 double ,float,int ,数组,指针)的指针。

void test(int a[]){
	printf("%d\n", sizeof(a));
}
int main(){
	int a[3] = { 0 };
	printf("%d\n", sizeof(a));
	test(a);
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

指针

指针:在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
通俗来讲指针是个变量,存放地址
在这里插入图片描述

int a = 10;//在内存中开辟一块空间
int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
  //将a的地址存放在p变量中,p就是一个之指针变量。

指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台是4个字节,在64位平台是8个字节。

int a=10;
int *p = &a;//
printf("%d",*p); //对指针解引用,指向其所指向的目标 

野指针: 就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
出现野指针的原因:

//指针未被初始化
int *p;//局部变量指针未初始化,默认为随机值
 *p = 20;
return 0;
//指针访问越界
 int arr[10] = {0};
   int *p = arr;
   int i = 0;
   for(i=0; i<=11; i++)
   {
       //当指针指向的范围超出数组arr的范围时,p就是野指针
       *(p++) = i;
   }
   return 0;

如何规避野指针

  1. 指针初始化
  2. 小心指针越界
  3. 指针指向空间释放即使置NULL
  4. 指针使用之前检查有效性

指针±整数: 对指针加一是加上指针所指向类型的大小==>(指针加上sizeof(type))
指针-指针: 表示两指针之间所经历的元素(元素的类型由指针决定)的个数,指向同一块内存才有意义,常用统一字符串、数组。
指针的类型:
1、决定了指针向前或者向后走一步有多大(距离)。
2、对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值