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,就会出错,原因在下面;
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的约束;