目录
-
介绍
==》 数组: 在程序设计时,为了处理时的方便,通常把同类型的若干数据变量按有序的组织起来(分配一段连续的储存空间),这些数据元素的集合就是数组。
==》 字符串:通俗的讲就是一串字符。这些字符是用数组组织,即就是字符数组。
==》 指针:在计算机中内存中,每个单元内存都有编号,为了方便访问便有了指针,指针的通俗理解就是内存这个房间的门牌号。(可以点击,进行了解)
-
数组定义
- 1、一维数组
类型+数组名+[常量表达式]
- 2、二维数组
类型+数组名+[常量表达式][常量表达式]
- 3、举例
//C语言
//数组的定义。这里简单的举例子。不是整个程序代码。
int arr[9];
char arr[9];
//注意!!数组名不能和当前代码块或者全局变量重复。如:下面错误的形式
main()
{
int arr=0;
int arr[9];
}
//注意!![ ]里必须是常量或常量表达式,不能是变量,如:
//这里错误的示范
main()
{
int a=9;
int arr[a];//即使初始化了变量也不行。
}
//这里正确的示范
#define D 9
main()
{
int arr[D];
}
//二维以上的数组不常用,所以不记录,但定义的方式就是加“[ ]”
-
数组初始化
数组的初始化和变量一样可以在定义的时候初识赋值。一般格式如下:
类型 + 数组名 + [ ]+ = {, , , };
- 1、一维数组 & 二维数组
//C语言
//数组的声明。
//一般格式:类型 + 数组名 + [ ]+ = +{, , , };
main(){
int arr[3]={1,2,3};
int arr2[3][3]={{1,2,3},{0},{1,2,3}};//这里写0,
//代表arr2[1][0]==arr2[1][1]==arr[1][2]==0
- 2、细节
数组的下标是从 0 开始的!!!!!!
-
sizeof关键字
sizeof是关键字,不是函数。它返回一个对象或者类型所占的内存字节数。它在数组计算中有很大的作用。下面举例说明一下
//c语言
//sizeof
//计算类型的字节数
//在说明类型的字节是一定要注意在什么环境下。现在是在32位编译环境下
void test1()
{
printf("int:%d\n",sizeof(int));//4字节
printf("char:%d\n",sizeof(char));//1字节
printf("double:%d\n",sizeof(double));118字节
}
//计算数组的字节数和长度
void test2()
{
int arr[5];
printf("char:%d\n",sizeof(arr));//20字节,5个元素 * 4个int所占的4字节 == 20字节
//这个时候计算数组的长度
int len = 0;
len = sizeof(arr)/sizeof(int)
//对比下面的公式,计算的不就是有多少个元素吗?
//5个元素 * 4个int所占的4字节 == sizeof(arr)
}
-
数组的访问
对于数组的访问,因为它是一段连续的空间,所以访问起来很方便,看随机的访问,或通过指针访问。任何数组都可以通过这两种方法访问。
int arr[6] = {1,2,3,4,5,6};这里有一个数组
随机访问:可以访问任何一个数,通过 [],数组的下标是从0开始的,所以访问1的时候,就是arr[0]。
指针访问:因为指针是指向数组首地址,所以访问 1的时候,也可以是*arr,访问5的时候可以是*(arr+5)。
-
数组运用
- 1、将数组A中的内容和数组B中的内容进行交换。(数组一样大)
//C语言
#include<stdio.h>
#include<stdlib.h>
//将数组A中的内容和数组B中的内容进行交换。(数组一样大)
void main() {
int arr1[10],arr2[10],temp[10];
printf("请输入10个数A10(空格隔开):");
for (int i = 0; i < 10;i++) {
scanf_s("%d",&arr1[i]);
}
printf("请再输入10个数B10(空格隔开):");
for (int j = 0; j < 10;j++) {
scanf_s("%d",&arr2[j]);
}
for (int k = 0; k < 10;k++) {
temp[k] = arr1[k];
arr1[k] = arr2[k];
arr2[k] = temp[k];
}
printf("NOW\nA10:");
for (int i = 0; i < 10;i++) {
printf("%d",arr1[i]);
}
printf("\nNOW\nB10:");
for (int i = 0; i < 10;i++) {
printf("%d",arr2[i]);
}
printf("\n:");
system("pause");
}
- 2、创建一个数组,实现函数init()初始化数组、实现empty()清空数组、实现reverse()函数完成数组元素的逆置
- 要求:自己设计函数的参数,返回值。
//C语言
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//先逆置,再初始化,再清空。节约时间,不用再定义数组或者初始化数组。
void reverse(int arr[],int len) {
int right = len-1;
int left = 0;
printf("逆置后的数组为");
while (left<=right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
--right;
++left;
}
int num = 0;
while (num<len) {
printf("%d ",arr[num]);
++num;
}
}
void init(int arr[],int len) {
int num = 0;
printf("\n");
printf("初始化的数组为:");
while (num<len) {
arr[num] = 1;
printf("%d ",arr[num]);
++num;
}
}
void empty(int arr[],int len) {
int num = 0;
printf("\n");
printf("清空后的数组是:");
while (num<len) {
arr[num] = '\0';//清空就是为空值
printf("%d ",arr[num]);
++num;
}
printf("\n");
}
void main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int len=sizeof(arr) / sizeof(arr[0]);//求数组长度,这里我直接使用
int temp = 0;
printf("原数组为:");
while (temp<len) {
printf("%d ",arr[temp]);
++temp;
}
printf("\n");
reverse(arr,len);
init(arr,len);
empty(arr,len);
system("pause");
}
-
字符串定义
其实c语言里面没有字符串这种类型,只是字符串可以理解成字符数组。字符数组有以下两种初始化格式或者是赋值格式。下面介绍
-
字符串初始化
与数组初始化一样,它也是数组
//C语言
//例子
//字符串
main(){
//这是C风格的字符串,没有'\0'结尾的,所以注意strlen()在这里不能用!!!
char ch[]={'c','o','m','p','u','t','e','r'};//字符串用char定义
//这里是'\0'结尾的,可以用strlen()函数。
char ch[]="computer";
char* arr="computer";//字符串指针
//带""都有'\0'
}
-
字符串函数---strlen、strcpy、strcmp
上面几个函数是经典常用的,所以当作例子介绍。字符串函数有很多,在后面的学习过程中会介绍。
//c语言
//strlen((char *s)函数,求字符串长度,针对字符串
void test1()
{
char str[] = "string";
int len = strlen(str);
//注意strlen函数,是在字符串中找到'\0',然后停下来。如果定义错了,strlen()就凉凉
}
//strcpy(char *dest,char *src)函数,字符产复制函数,把src指针的字符串复制一份到dest
void test2()
{
char* str = "string";
char s[7];
strcpy(s,str);//一定要保证s的空间是足够容纳*str这个字符串的
}
//strcmp(char *str1, char *str2),根据ASCII码表来比较的。每个字符每个字符来比较。
//这个函数为Windows特有,str1 > str2,则返回大于0,等于则返回0,否则返回小于0.
void test3()
{
char* str1 = "string";
char* str2 = "abcdef";
printf("%d\n",strcmp(str1,str2));
}
-
说到这儿,请注意strlen和sizeof的区别和陷阱
数组和指针渊源很深,所以对于strlen和sizeof非常有关注的必要,所以专门写了一个专题。对数组和指针理解也有很大的帮助
-
字符串运用
- 1、有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
- 要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
//C语言
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//有一个字符数组的内容为:"student a am i",
// 请你将数组的内容改为"i am a student".
// 要求:
// 不能使用库函数。
// 只能开辟有限个空间(空间个数和字符串的长度无关)。
//
// student a am i
// i ma a tneduts
// i am a student
int leng(char* str) {
int len=0;
while(str[len]!='\0'){
++len;
}
return len;
}
void swap_one(char* str, int star, int end) {
while (star <= end) {
char temp = str[star];
str[star] = str[end];
str[end] = temp;
++star;
--end;
}
}
void swap_two(char* str) {
int temp = 0;
int start = 0;
int end = leng(str) - 1;
swap_one(str,start,end);
printf("第一次翻转后的字符串:%s\n",str);
while(str[temp]!='\0') {
start = temp;
while((str[temp]!='\0')&&(str[temp]!=' ')) {
temp++;
}
end = temp - 1;
swap_one(str,start,end);
if (str[temp] != '\0') {
temp++;
}
}
printf("最后一次翻转后的字符串为:%s\n",str);
}
void main() {
char orig[] = "student a am i";
printf("原字符串为:%s\n",orig);
int end = leng(orig)-1;
int star = 0;
swap_two(orig);
system("pause");
}