-
预科第十一天
今天讲的东西不算多,只有字符串和指针与数组的关系两点,但是这两点任何一点拿出来都足够让我琢磨好久了。尤其是指针与数组结合真是伤脑筋,绕不出来。不知道通过练习能不能对这部分内容有所了解。
26.字符串
内存分配
栈区:存储局部变量的数据
堆区:由程序员malloc出来的空间
全局区(静态区):全局变量,静态变量
文字常量区:常量字符串(内容不可更改)
代码区:二进制代码
所有的字符串都可以看成字符数组
字符串:由多个字符构成的集合
字符串的定义
char ch[5];
1.字符串的初始化
char string[10] = {"hello"};
2.
char string2[10] = "hello";
3.
char string3[] = "hello";
4.
char *p = "hello";
printf("p = %p\n",p);
p = "world";
printf("p = %p\n",p);
printf是打印第一个字符串,\0在字符串当中是一个不显示字符,加上\0代表一个字符串结束
char *q = "yy";
char *q1 = "yy";
printf("q = %p\n",q);
printf("q1 = %p\n",q1);
计算字符串的实际长度strlen,不包含\0这个字符,要包含头文件#include<string.h>
char string[] = "hello world";
long int length = strlen(string);
printf("%ld\n",length);
拷贝
char string[10] = "hello";
char string1[6];
目标字符串的大小>=strlen(源字符串)+1,否则会出现段错误或程序崩掉
strcpy(string1,string);
printf("string1 = %s\n",string1); //打印字符串时用%s
char string1[11] = "hello";
char string2[10] = "world";
strcat(string1,string2);
printf("string1 = %s\nstring2 = %s\n",string1,string2);
如果编译器比较低级:string1>string=1,string1<string=-1,string1=string=0;
如果编译器比较高级:string1<string2=从第一个不同的字母相减,string1>string2=从第一个不同的字母相减,string1=string2=0;
char string1[10] = "hello";
char string2[10] = "hgllo";
//strcompare
int res = strcmp(string1,string2);
printf("res = %d\n",res);
char string1[10] = "ha";
char string2[10] = "h";
//strcompare
int res = strcmp(string1,string2);
printf("res = %d\n",res); //res=97
//拷贝前几个字符串
char dst[10] = {0};
char source[20] = "nihaoworld";
strncpy(dst,source,5);
printf("dst = %s \n",dst);
//strncat剪切前几个字符
char dst[20] = "hello";
char source[10] = "nihaoworld";
strncat(dst,source,5);
printf("dst = %s\n",dst);
//strncmp
char string1[20] = "hellonihao";
char string2[20] = "helloworld";
int res = strncmp(string1,string2,5);
printf("res = %d\n",res);
16进制:09f
a b c d e f
a=10 b=11 ... f=15
指针和数组的关系
数组在内存中是一个连续存储的集合
int array[5] = {1,2,3,4,5};
&数组名[下标]
int i;
for(i = 0;i < 5;i++)
{
printf("arr[%d]的地址 = %p\n",i,&array[i]);
}
int i;
for(i = 0;i < 5;i++)
{
printf("arr[%d]的地址 = %d\n",i,*(array+i));
}
printf("arr = %p\n",array + 1);
1>一维数组的数组名就是首元素地址;
2>如果是某个地址变量+i:实际上是+sizeof(数组元素的类型)*i;
3>访问第i个元素的地址:
&array[i] ==========> array+i;
4>访问第i个元素的值:
array[i] =========> *(array+i);
如果有下列等式成立:int *p = &array[0];//int *p = array;那么访问第i个变量的地址:p+i===>&p[i];
访问第i个变量的值:*(p+i)===>p[i];
array能做的事,p都能做,array不能做的事,p也能做,比如说:array++是错的,p++是可以的
int *p=&array[0];//int *p=array;
for(i = 0;i < 5;i++)
{
printf("arr[%d]=%p\n",i,&p[i]);//p+i
}
二维数组:由多个一维数组构成的数组
数据类型 数组名[row][colum];
二维数组的定义:
int array[3][4];
1.初始化
int array1[2][3] = {{1,2,3},{4,5,6}};
2.用0补全
int array2[2][3] = {{1,2},{4,5}};
3.
int array3[2][3] = {1,2,3,4,5,6};
4.行号可以省略,列号不能省
int array4[][3] = {1,2,3,4,5,6};
5.
int array5['a'][3] = {0};
6.
int array6[2][3] = {{[1] = 1,[2] = 5},{[1] = 4}};
二维数组元素:数组名[行下标][列下标]
int array[2][3] = {1,2,3,4,5,6};
printf("array[1][2] = %d\n",array[1][2]);
int row,colum;
二维数组的遍历
for(row = 0;row < 2;row++)
{
for(colum = 0;colum < 3;colum++)
{
printf("array[%d][%d] = %d ",row,colum,array[row][colum]);
}
}
打印空心菱形
*
* *
* *
* *
* *
* *
*
int array[7][13] = {
{[6] = 1},
{[4] = 1,[8] = 1},
{[2] = 1,[10] = 1},
{[0] = 1,[12] = 1},
{[2] = 1,[10] = 1},
{[4] = 1,[8] = 1},
{[6] = 1}
};
int i,j;
for(i = 0;i < 7;i++)
{
for(j = 0;j < 13;j++)
{
if(array[i][j] == 1)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
自定义一个2*3列的整型数组,求其最大值
int array[2][3] = {{1,3,5},{2,4,6}};
int max = array[0][0];
int i,j;
for(i = 0;i < 2;i++)
{
for(j = 0;j < 3;j++)
{
max = max < array[i][j] ? array[i][j] : max;
}
}
printf("max = %d\n",max);
int arr[2][3];
二维数组内存也是连续的
int i,j;
for(i = 0;i < 2;i++)
{
for(j = 0;j < 3;j++)
{
printf("arr[%d][%d]的地址 = %p\n",i,j,&arr[i][j]);
}
}
i,j地址:
a[i]+j ==> &a[i][j] ==> *(a+i)+j;
i,j值
*(a[i]+j) ==> a[i][j] ==> *(*(a+i)+j);
i行0列元素地址:
&arr[i][0] ==> *(arr+i) ==> a[i]
==> a+i (i行一维数组的地址)
int a;
int *q=&a;
int arr[2][3]={1,2,3,4,5};
//先算小括号,代表p这个变量是一个指针变量,再算[],代表将来这个指针指向的是一个大小为3的整型一维数组整体;
int (*p)[3];//数组指针
p=arr;
/*
二维数组和指针的关系:
只要有int (*p)[3]=arr;等式成立,arr能用的情况,p都能用,arr不能用的情况,p也能用
*/
int i,j;
for (i=0; i<2; i++)
{
for (j=0; j<3; j++)
{
printf("arr[%d][%d]=%d\n",i,j,p[i][j]);
}
}
指针数组
int a,b,c;
先算[]代表他是一个数组,再算*,代表这个数组里面存储的都是指针变量
int *arr[3] = {&a,&b,&c};
*(arr[0]) = 9;
printf("a = %d\n",a);