什么叫数组呢?我们的第一反应是很多数组合在一起就是数组,字面意思,当然不仅仅是数字,字符也是可以的.
数组属于构造类型 .指相同类型的若干变量组织起来.
类型说明符 数组名 [常量表达式]
int array[] ={0} //定义一个空数组 .
1.数组的类型实际上是指数组元素的取值类型,对于同一数组,所以的数据类型都是一样的
int array1[] = {78,'o',10}; //o会转化为ASCII值,所以也是整形
//也是可以,是不是于上面的话矛盾呢?其实不是的,他说明的是里面的数组元素 都会转化为同一数据类型,不是说开始输入就全部相同
int array2[] ={ 67,32.3,92,16 };
2.方括号的表示元素的个数,不能用变量来表示,只能使用常量或者常量表达式.
int a = 3;
int array[a+1] ={...} //肯定要报错
3.打印数组是需要使用for循环,而不能简单的使用printf()函数
for(int i =0 ;i < strlen(array);i++){
printf("array[%d] = %d\n",i,array[i]);
}
4.数组中下标越界
float score[] ={34.4,63.1,98.2,65.3,93.7,39.5};
printf("%f\n",score[56]); //很明显score的下标小于56,在C语言中警告,但是在OC中会报错,需要注意'
5*.冒泡排序法
看了好多人写的冒泡博客,都是只写个程序,没什么具体的执行过程:
初始: 34 89 12 45 6 27 52 69 八个数进行从小到大的排序
34 89 12 45 6 27 52 69 //第一位34第二位89比较, 34<89 不用换
34 12 89 45 6 27 52 69 //第二位89和第三位12比较, 89 > 12 需要换
34 12 45 89 6 27 52 69 //第三位89和第四位45比较, 89 > 45 需要换
34 12 45 6 89 27 52 69 //...
34 12 45 6 27 89 52 69 //...
34 12 45 6 27 52 89 69 //...
34 12 45 6 27 52 69 89 //.. @3
到此第一轮循环结束 ,89最大的值出来了,使用7次循环,然后我们在根据 @3的那组数字在来一遍 最后就剩2个数 ,不用在判断了.
通过判断需要使用八轮 这样的循环,所以for循环嵌套
for(int i = 0 ; i < n-1 ;i++){ //n代表个数 i从0开始, 最后一个数不用比较, 趟数总是比元素个数少一个.
for(int j =0 ; j < n-i-1;j++ ) {
//第一轮7次内部循环 7+1 =8, 8就是n,但是我们j是从0起始,所以j<n-i-1 相当于8-0-1 刚好<7
// 或者(for j =n-1;j>=n;j--){..} 第一趟循环完成之后,开始第二趟,又开始从第一个和第二个,第二个和第三个...
//交换数值,在内部循环中交换
if( array[j] > array[j+1]){
int temp =array[j];
array[j] = array[j+1];
array[j+1] =temp;
}
}
}
但是我们发现很多时候我们不需要那么多的排序:,所以我们需要进行优化:
for(int i = 0 ; i < n-1 ;i++){
int flag = 0 ; //设置一个标记符 为0 表示未经过if判断和交换值.
for(int j =0 ; j < n-i-1;j++ ) {
if( array[j] > array[j+1]){
int temp =array[j];
array[j] = array[j+1];
array[j+1] =temp;
flag = 1;
}
}
if(!flag){
break;
}
}
5.字符数组
char str[] ="Iphone5S"; //系统会分配9个空间
char str1[] = {'i','p','h','o','n','e','5','s'}; //系统指挥分配8个空间
char str2[] ="6 Plus";
char str3[] ={0};
不同的是str后面还有一个隐藏的结束符号.完整的Str="Iphone5S\0", str1字符数组中在添加'\0'跟str就完全相同.
sizeof( ) 他不是一个函数,只是要操作符号,于++或者-- 相同,返回一个变量或者常量在内存中占的空间大小.
例如:
int count =9;
int num = sizeof(count);
printf("The end of Result :%d ",num); //为4个字节
printf("%s\n", str1); //2个字符数组都可以输出,%s打印字符串和字符数组
strlen(str1);
//或者str1长度,就是实际的字符个数,8个 ,strlen 只适用于字符数组,数字数组的长度 = (sizeof(array) / sizeof(array[0]))
printf("%lu",strlen(str1)); //l代表long u表示unsinger无符号
strcat和strcpy有一个共同的特征,都是将后面的值给到前面.
strcat(str,str2); //讲后面的str2拼接到前面str,str2不变,str 改变了
strcpy(str3,str); //后面的str复制给空的数组str3
字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"A"和"b"比较则会返回字符"A"(65)和'b'(98)的差值(-32)。
【返回值】若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。
strcmp(str,str1); //用来比较字符串(区分大小写),str于str1都必须是字符数组,在PHP 语言中就是字符串
char s1 = "AbCd";
char s2 = "aBcD":
int num =strcmp(s1,s2); //这里是s1 -s2
printf("The end of Result :%d",num);
最后考虑一个问题,如何讲2个int数字合并为一个数组
int a1[] ={23,56,4,90};
int a2[] ={45,52,79,34,8};
int a3[] ={0}
for(int i= 0 ;i < 9; i++){ //9为2个数组长度之和
if(i < 4){
a3[i] =a1[i];
}else {
a3[i] = a2[i-4];
}
}