数组

定义

由数据类型相同的一系列元素组成

size_t arr[index]={ }

*当{}内列出元素的值,可以让编译器自己数出数组大小,此时index可省略不写。数组的长度可以用(sizeof arr)/(sizeof arr[0])间接得出

初始化

不完全初始化时,编译器会把剩余的未初始化的数组初始化为0.

C99中在大括号内对指定元素赋值可用{[index] = data}的形式表示

未初始化的数组不要随意使用,内部数据是随机值。

不能使用变量定义数组(新手极易犯此种错误)
ps:C99引入了“变长数组”,可以用变量定义数组,但是声明时不允许初始化。

用const声明数组

只读数组用const声明,只能检索不能修改,程序稳定性更高。

数组溢出

对于定义的type arr[index],实际的下标边界是从0~index-1

多维数组

size_t arr[index1] [index2]={ }

*二维数组的定义和赋值形式如上,不能缺省二维的长度说明

二维数组的遍历需要双重循环

用途:char类型的一维数组存放字符串:char a[ ]={‘t’,‘e’,‘x’,‘t’,’\0’}等价于char a[ ]=“text”;,二维数组能够存放多个字符串,且采用初值表进行初始化时‘\0’必须给出。此时arr[i] [j]表示引用某个字符,而arr[i]表示引用某个字符串

字符串数组

char s[]={‘h’,‘o’,‘y’,’\0’}或者char s[]={“hoy”} 输出时printf()内用%s的格式
(内部的原理是从首地址逐个取出,直到遇到‘\0’为止

如果输出遇不到\0:按照定义变量时的存储规则(定义的先后存储时地址从大到小也是从下到上),会打印出相邻地址的字符。注意:‘\0’对应的ASCII值是‘0’,若数组后位为0也不会错误。

数组传参

将数组传入目标函数,传入的是首个元素的地址,无法在内部用sizeof(arr)/sizeof(0)得到数组长度,所以必须要在外部算出数组长度再把长度一起传入。/将数组传入函数时,要单独传入数组的大小/

一定记住!传入的是地址 地址 !不是整个数组的值!必须同时传入长度 长度 长度!
长度要在主函数内算出来k

深入理解数组

在C中数组名表示第0个元素的地址,即对于定义的a[index]数组,a等价于&a[0],实质是一个地址常量,其值不能更改,做比较也无意义。

  • 存储:连续存放
  • 数组名:首元素的地址。 *arr——读取首元素的值

例外!:sizeof()内部单独放一个数组名,计算的是整个数组占的字节大小。&数组名,取出的是整个数组的地址,虽然和首元素地址相同但是跨度是整个数组!


指针

定义

存放变量的地址。一定要指向一个变量

int *p = &x;

同一个变量可以有多个指针指向它,但一个指针不能同时指向多个变量,指针的指向可以修改

空指针:给指针赋一个NULL值 int *p = NULL; p的地址为0x0

检查空指针:

  1. if(p) //如果非空(可访问)则执行
  2. if(!p) //如果为空(不可访问)则执行

*多级指针:int *pp 存放*p的地址

*解引用操作符:通过地址找到对象。对pp的解引用找到的是p, 而*p就访问到x

指针的运算

  1. 指针的递增递减:p++ (p–)用指针代替数组,因其自增自减的性质,从而便于顺序访问内存中的每一个元素。注意区分*p++——(++的对象是指针)和§++——(p所指对象++)

    数组名称不能做加减运算操作,只有指针才可以;指针的加减按照单元(根据类型分配字节数)。

  2. 指针的比较:地址的比较,可以用作遍历数组的循环条件等。

应用场景

1、函数需要返回多个值,即需要保存多个变量的改变量

2、函数返回运算状态,结果由指针返回

传入数组就是传入指针,指针可以当作数组使用,只要传入大小. *数组是const的指针,即int b [ ] ;等价于int * const b ;

const int p=&i; 表示不能通过p去修改i,但变量仍可被赋值,p也可以指向其他的变量。

在函数中改变数组的元素,main中的数组元素的值也改变。

3、用指针来存放字符串,字符串存储在常量区,无法对**p[0]**进行修改,

数组保存的字符串以变量形式存储在栈中

需要使用时即调用,效率高,开辟的存储空间少。

常用重定义:typedef char * string;

指针数组

实质是数组,存放指针。

int* arr[3] = {&a,&b,&c};


深入理解指针的存储

指针本身需要计算机用内存存储。

无论什么类型的指针,占据的内存区大小是相同的

这就是为什么sizeof一个数组时(数组跟指针有互通之处)得出的值恒为8或4了。


函数指针

void ( funcP) ();* 定义

funcP = function; 指向函数,不要写成function()

(*funcP)(); 等价于 funcP(); 等价于 function(); 使用

c语言笔记之数组和指针(初学者)相关推荐

  1. c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc

    C语言的二数组的指针访问 二维数组的指针访问 --王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点.如果真正弄懂了这个问题,就可以说你学会了使用指针. 二维数组的指针 指针就是地址 ...

  2. c语言二维数组 ppt,C语言二维数组与指针.ppt

    C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...

  3. c语言指针转换成数组,浅议C语言中灵魂数组和指针的互操作(转)

    浅议C语言中灵魂数组和指针的互操作(转)[@more@]曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减. 当然了,这是无可非议的,但是 ...

  4. c语言数组与指针的基础知识,C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  5. C语言二维数组的指针写法

    C语言中二维数组要用Int** 来表示,在分配空间后,int**加一会移动到下一行.而m行n列的二维数组的寻址方式是首地址a+in+j,因此先对a+i找到相应的行,也就是一维数组,并且取得到一个int ...

  6. 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作

    文章目录 一.数组与指针 1.手搓冒泡排序(从大到小) 2.矩阵的转置和打印 3.判断矩阵是否对称 4.最大元素与最后元素互换(用指针) 5.首地址偏移法逆序排序 6.指针移动法逆序排序 7.用元素指 ...

  7. C语言 函数返回数组和指针区别

    1.示例代码 #include <stdio.h>char * str1() {char A[] = "Hello!";return A; } char * str2( ...

  8. c语言笔记5-数组和指针

    1.指针:指针在本质上也是一个变量 指针需要占用一定的内存空间,不同类型指针占用的内存空间大小相同 指针用于保存内存地址的值 可以通过指针修改内存中的任意地址内容 2. *号的意义 在指针声明时,*号 ...

  9. C语言下标要求数组或指针,c语言改错 error C2109: 下标要求数组或指针类型怎么改?...

    /*魔方阵*/ #include int main() { int i,j,a,n; int arr[100][100]; printf("请输入n,n为100内奇数\n"); s ...

最新文章

  1. 【PAT (Advanced Level) Practice】1050 String Subtraction (20 分)
  2. 简单检测CDN链接是否有效
  3. Python编程基础:第五十五节 map函数Map
  4. php56wmysql_centos6.5下使用yum完美搭建LNMP环境(php5.6)【Fizzday整理】
  5. MixPath:基于权重共享的神经网络搜索统一方法
  6. 树的存储结构以及实现代码
  7. opencv2 取二进制数据_百亿数据量下,掌握这些Redis技巧你就能Hold全场
  8. python 列表副本_列表副本不工作?
  9. 人脸识别(8)----人脸识别主要算法原理
  10. 中国水下充气袋行业市场供需与战略研究报告
  11. 汽车VIN码超详细解析规则
  12. Centos7配置软RAID+LVM
  13. 星载SAR的各项指标解读(史上最全)
  14. 彻底搞懂AQS-重点方法精讲 [并发劝退- 哭唧唧]
  15. 编程实现在IntAct数据集上批量查找蛋白交互对
  16. 计算机应用越来越广泛翻译英文,越来越普遍英语,越来越普通的英文?
  17. 用python画蟒蛇
  18. grep 命令的使用
  19. mysql cast 整数_Mysql-CAST/CONVERT 类型转换函数之 整型
  20. 什么是拓扑结构、拓扑结构图

热门文章

  1. android 上下翻页素材,【Android 进阶】仿抖音系列之翻页上下滑切换视频(四)...
  2. linux中fstab含义,fstab每一列的含义
  3. springboot中的拦截器interceptor和过滤器filter,多次获取request参数
  4. getLocationOnScreen不起作用原因
  5. ubuntu navicat删除目录破解如何保留配置信息
  6. Ant Design Pro 登录超时处理
  7. Mysql 查询返回结果空时间错误
  8. java调用dubbo服务器_dubbo源码分析-服务端注册流程-笔记
  9. 通用的MIME类型:application/octet-stream
  10. redis 缓存 key常量命名规则