Linux C语言:字符串与数组

1 . 数组申明的内存排列

数组的大小不能用变量;

#include <stdio.h>
int main()
{
	int a=3;
	int b=2;
	int array[3];
	array[0]=1;
	array[1]=10;
	array[2]=100;
	int *p=&a;
	int i;
	for(i=0;i<6;i++)
	{
		printf("*p=%d\n",*p);
		p++;
	}
	printf("--------------------------------------------------\n");
	p=&a;
	for(i=0;i<6;i++)
	{
		printf("p[%d]=%d\n",i,p[i]);
	}
	return 0;
}

运行结果:

linux@ubuntu:~/workspace/array$ ./main.out
*p=3
*p=-1075484268
*p=2
*p=2
*p=134513888
*p=0
--------------------------------------------------
p[0]=3
p[1]=-1075484272
p[2]=2
p[3]=2
p[4]=134513888
p[5]=0

可以看出两种寻址方式结果一样。

(gdb) x/3d 0xbffff348
0xbffff348:	0	2	134513920

实现了从后面的地址开始连续读3个数,以十进制(d)显示;

2 . 指针运算

int *p=&a;
p++;

执行p++后执行p p(gdb中查看p指针的内容),发现地址加了4;
这是因为p指针是指向的是int类型的,每个int四个字节。

p+=3 p[3]指向的是一个地址,但是后者p没有偏移。‘’

数组名本身是一种指针常量,不能被改变。

3 . 字符数组和指针字符串

linux@ubuntu:~/workspace/cstring$ cat main.c
#include<stdio.h>

int main()
{
	char str[]="hello";//字符数组以\0结束;
	char *str2="world";
	char str3[10];
	printf("input the value \n");
	scanf("%s",str3);
	printf("str is %s\n",str);
	printf("str2 is %s\n",str2);
	printf("str3 is %s\n",str3);
	return 0;	
}

1:

scanf("%s",srtr3);

str3是一个数组名,scanf中不需要加取地址符&;

2:

scanf("%s",srtr3)

中的str3换成str,也可以往str中写数据;
但如果把str3换成str2,就会出错,原因在下面;

扫描二维码关注公众号,回复: 9368973 查看本文章

3:

(gdb) p str
$1 = "hello"
(gdb) p &str
$3 = (char (*)[6]) 0xbffff346
(gdb) x/6c 0xbffff346
0xbffff346:	104 'h'	101 'e'	108 'l'	108 'l'	111 'o'	0 '\000' //字符前面的数字是ASCII码
(gdb) p str2
$2 = 0x8048630 "world"
(gdb) p &str2
$4 = (char **) 0xbffff338

0x8048630在代码段,代码段不允许随意修改,所以scanf("%s",srtr2)会出错;

不可以声明:

char *str2;
*str2="abc";

或者:

char *str2;
*str2='a';

4:
char str[]和char str3[10]在栈内存里(是变量),可以修改;
char *str2在代码段(是常量),不可以修改;

5 . 字符数组的深入理解

字符串的结尾\0不会显示出来;
用for循环逐个字符输出的时候不会受\0的约束;

发布了30 篇原创文章 · 获赞 36 · 访问量 686

猜你喜欢

转载自blog.csdn.net/qq_42745340/article/details/103921153