C/C++指针与一维数组 字符串的指针表示 指针数组和数组指针

1.一维数组

数组:多个相同类型的变量被存储在一片连续的存储单元中

一.定义

当数组中每个元素只带一个下标时,称这样的数组为一维数组。
格式: 类型名 数组名【整型常量表达式】
如 int a[10]
1.数组名表示数组存储区的首地址.
2.数组元素的下标值由0开始,a[0],a[1],a[2],…,a[9]
3. c语言不允许定义动态数组,即数组的长度不能依赖运行过程中变化着的变量。例如:这样定义数组是不允许的

int i;
scanf("%d",&i);
int data[i];

4.在内存中给数组中每个成员开辟了一个存储单元.总计大小:10*4=40字节。这样每当调用数组中的一个成员就用他们的下标

二.一维数组元素的引用

格式: 数组[下标表达式]
其实x[0],x[j],x[j+k]都是对数组中元素的合法引用形式。但是需要注意的是下标表达式的值必须大于或等于0,并且小于数组上界的数
建立下面概念:
1.一个数组元素实质上就是一个变量名,代表内存中一个存储单元。一个数组占有一串连续的存储单元。
2.c语言规定数组名是一个地址常量,他代表整个数组的首地址

int *p; int a[10]; p=a(p=&a[0]); 

a = = &a[0] 地址名也就是数组名不可被赋值 也就是说若a=10,一定是错误的
3.数组袁术下标表达式的值必须是整数

三.一维数组元素的初始化

1.当花括号的值少于数组元素个数时,将自动给数组后面元素赋值0,如
int a[10]={1};这个时候除了a[0]=1,其他的都是0;
对于字符型数组也是一样

char a[10]={'\0'};
不够的也会赋值'\0'

2.c语言规定,可以通过赋初值来定义数组的大小,这时数组说明符的一对方括号可以不指定数组的大小
如 int[]={1,1,1,1,1,1,1,1,1,1};
这样相当于数组中有了10个元素
3.举例

#include <stdio.h>
int main(void)
{
	int a[10];
	int i,*p;
	p=&a[0];//或p=a; 
	for(i=0;i<10;i++)
	scanf("%d",p++);
	for(i=0;i<10;i++)
	printf("a[%d]=%d\n",i,a[i]);
}

//通过键盘给数组a中的10个成员赋初值。
//指针并未移动,我们一直在改变a[0]的值

2.移动指针

所谓指针移动1就是对指针变量加上减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。
在这里插入图片描述
对指针进行加减运算时,数字"1"不在代表十进制数1,而是指一个单位存储单元长度.这个单元多长,要看存储数据的类型了(因此只有指针指向一串连续的存储单元时,指针的移动才有意义

3.一维数组和数组元素的地址

一.前言:

定义的数组名可以认为是一个存放地址值的指针变量名.其中的地址值是数组第一个元素的地址,也就是数组所占一串连续储存单元的起始地址。重要的是:这个指针的地址值不可改变,也就是说,不可以给数组重新赋值。因此,也可以认为数组名是一个地址常量
float a[10],*p,x;
语句a=&x或a++这样的语句都是非法的,因为不能给a重新赋地址值。一旦定义a永远指向a数组的首地址
虽然不可以改变数组中a的内容,但可以对数组名加一个整数的办法,来依次表达该数组中不同元素的地址
int a[10],*p,p=a+4~~~~~~~p=&a[4]
再如

for(k=0;k<10;k++)
		p=a+k;
在循环中并没有改变数组名a中的内容,但通过表达式:a+k逐一给出了a数组中每个元素的地址,使p依次指向a数组中的每一个元素。
如果要能类似上面的语句给数组中的元素赋值,语句为:
for(k=0;k<10;k++)
	scnaf("%d",a+k);

通过数组的首地址引用数组元素
a是数组元素的首地址,a(即a+0)的值即等于&a[0],则用a+1的值等于&a[1]
数组a[0],可以用表达式*&a[0]来引用 * (a+0),还可用a[0]来表示。
但需要注意的是对于*(p+k)这样的表达式不能这样写*p+k,这样的意思为指针取值后加上k的值。
总结:数组元素s[i]的表达式应当有
s[i] *(s+i) *(p+i) *p[i]

二.实例

指针和一维数组相互替换

	#include<stdio.h>
#include<string.h>
int main(void)
{
	char *str="I love ying";
	int length; 
	length=strlen(str);
	for(int i=0;i<length;i++)
	{
		printf("%c",str[i]);
		 
	} 
}

4.一维数组的指针表示

int a[10];
int *p;
p=&a[0];

注意

  • 数组名a其实是个指针常量,一次不可赋值
  • p=a; 和p=&a[0];是等价的,指针默认指向数组元素的首地址
    可写成
int a[10];
int *p=a;
  • 数组元素可以用下标a[i]表示,因此数组元素a[i]的地址可以表示为&a[i]或a+i那么形如*(a+i)是数组元素的指针表示法

归纳

  • a[i]地址可表示为 &a[i] ,a+i, p+i
  • a[i]本身表示为*&a[i] ,*(a+i) ,*(p+i)

字符数组和指针实例

可类比c语言内部strlen函数 记得它要加头文件<string.h>

#include<stdio.h>
int main(void) 
{
	char str[]="I love ying";//数组名是个指针常量。不可修改 
	char *p=str; //转用指针变量指向数组。 
	int count=0;
	while((*(p++)) !='\0')
	{
	
		count++;
		
	}  
		printf("总共有%d个字符",count); 
		return 0;
} 

5.指针数组和数组指针

1.指针数组

指针变量可以同其他变量一样作为数组的元素,由同类型的指针变量组成的数组称为指针数组
类型说明符 *数组名[数组长度]
[ ] 优先级高于 *
int *p[3] p先与[3]结合,表示p是一个数组,它有三个数组元素 ;再与 * 结合,表示数组的每个元素都是int *类型的 即数组元素都是整型指针变量

2.实例

#include<stdio.h>
int main(void)
{
	int a=1;
	int b=2;
	int c=3;
	int d=4;
	int e=5; 
	int *p[5]={&a,&b,&c,&d,&e};
	for(int i=0;i<5;i++)
	{
		printf("%d\n",*p[i]);
	} 
} 

6.指针与一维数组疑问个人答疑(非公开)

个人答疑,与该笔记无关

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值