C语言字符串和数组

目录

1.数组
2.字符串
由于字符串和数组在某种程度上有相通性,所以放在一起讲

数组和字符串的很多例题习题

数组

首先数组的定义方式是如:int array[size];这里的size是常量,也就是说const int num=5;这里的num是可以作为数组元素的个数来定义数组的,int array[num];是可以通过编译的。

数组的特点是:存放类型相同的变量,且空间连续存放,所以可以采取随机访问
在开辟数组的时候要满足大开小用,数组a[n]中n填的数,必须是一个整型类型的正数常量,数组的开头是a[0],而不是a[1];
int *p=ar;
这是ar是数组的首元素地址
那么
int *p=&ar[0];
和上面的表达式是等价的,在一维数组中,这两个表达式的意义和数值都是等价的
在二维数组中是不等价的。

在对数值的访问我们目前有一下几种方式

printf("%d %d",ar[i], *ar(i+1))

printf("%d %d",p[i], *p(i+1))

编译器会把ar[i]的这种写法解释为*ar(i+1)

之所以这几种方式都可以正确访问数组的元素,这是因为,ar在除sizeof的情况下都表示数组的首元素地址,所以这时的p和ar的意义相同,那么自然“ * ”这个引用的方式都是相通的

int ar[10]={12,23,34,45};
int br[10];
br=ar;

上面的表达式无法编译通过,因为数组名在除sizeof的情况下都表示首地址。
只有在sizeof中ar代表了整个数值
所以上面的赋值运算就变为了两个地址常量在赋值,但是常量是不能给常量赋值的,所以无法编译通过

int ar[10]={1,2,3,4,5,6,7,8,9,0};
sizeof(ar);//计算结果为10,这是ar就不是数组首元素了
int &br=ar;//这样编译是无法通过的,应为br是一个整型引用
int (&br)[10]=ar;//这才是正确的方法,中括号的数必须和数组元素个数相等
//不能说为了引用数组的前五个元素,而在中括号中填5;
int **p[10];//这是一个数组,存放的是二级指针

数组在函数中的调用时,我们不能开辟另一个相同的数组作为形参

void fun(int b[10])
{
}

void main()
{
	int ar[10] = { 0, 1, 3, 4, 5, 5, 6, 7, 8 };
	fun(ar);
}

这样的代码不好,当数组的大小比较小时,还体现不出来问题,但是当我们假设数组的大小是10万时问题就出来了,我们在fun()函数的栈帧中要开辟10万大小的空间,还要将10万个数的值传递,这样函数的效率就太低了
所以我们在这种情况下,会采用指针的方式,来调用数组,这样的效率就比较高

void fun(int *b, int n)
{
	int *p = b;
	int *q = p +n;
	while (p < q)
	{
		printf("%d ", *(p++));
	}

}

void main()
{
	int ar[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	fun(ar, sizeof(ar) / sizeof(int));
}

这种通过指针引用的方式,就快得多

字符串

字符串:char str[]={"lilingjie"} 数组:char str[]={'l','l','j'} 这两个的区别在于字符串的结尾有一个/0作为结束字符,而且字符串可以用printf("%s")来打印,但是数组不能这么打印,因为以%s打印需要以‘/0’作为标记结束打印,并且在做结束操作时,由于没有\0会很麻烦

接下来接介绍字符串的常用函数:strcpy(),strcat() strcmp()

下面是一个面试题
char ch1[] = “yangheping”;
char ch2[] = “yangheping” ;
const char *str1 = “yangheping”;
const char *str2 = “yangheping”;
请判断:
ch1 == ch2
str1 == str2 的真值

ch1和ch2数组名代表数组的首地址

两个字符串是放在栈区的,(ch1 == ch2) << endl; // 0
是因为ch1和ch2
都指向两个字符串的首元素地址,然而在栈区中两个字符串的变量名字不同,且ch1[]和ch2[]让系统在内存中为其开辟了两个空间来存放字符串,尽管这两个字符串的内容完全相同。但因为他们的他们存放的字符串首元素地址不同,所以比较结果为0

而char *str1 = “yangheping”;
char *str2 = “yangheping”;这种情况使得编译器认为他是字符串常量,str1和str2这两个指针变量是在栈区的他们指向了数据区的yangheping这个字符串常量的首地址,"yangheping"是存在数据区的,且在数据区中相同常量只存在一个并且不能给改变,所以str1和str2所指向的首地址,所以他们俩相同。

这就相当于 int a =10;他在计算机中实际的操作是mov [a],0ah
0ah就是16进制的10,这时的10在代码区里,并没有给这个常量开辟空间
而我们不能把一个字符串“yangheping”给直接赋值给一个指针变量*str,所以编译器将这个字符串放到了数据区存放,然后用指针指向这个字面常量的首地址。

同时我们可以进行
ch1[0]=‘x’;这样的操作,但是我们不能进行str1[0]=‘x’;的操作,因为系统将原来的数据区空间的字符串,设置为常量,它只能读不能写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值