指针和数组的转化:数组可以转化为指针,反之不成立,数组相当于指针,一个*相当于一个维度。
- 数组的长度必须是常量,index可以是变量
- 数组定义未给定长度时,长度为初始化列表的长度;否则为定义长度。
- 初始化列表只能用于初始化数组,对数组的赋值必须逐个进行。
//for example
int main(){
int year[10];
year [10]={0};//it's wrong.
for(int i=0;i<10;++i){
year[i]=0;//it's fine.
}
}
- 数组的名字是地址
int main(){
int num[10];
//int sum=0;
printf("%X\n",num);
printf("%X",&num);
}
//in fact ,they are the same
//61FDF0
//61FDF0
- 数组的长度用于计算所需的局部变量看空间的大小,之后,长度会丢失,这时因为访问数组元素时无需知道数组的大小
- 数组作为参数时,传递的只有数组的地址,而不是传递各个元素的值,作为参数会省略长度这一参数,所以长度需要另外传递
for example:void text (int array[20],int length)
//20会被省略,length才可以用来传递长度
- sizeof这个关键字可以用来传递数组的长度,strlen这个函数可以用来传递字符串的长度,但是如果sizeof用在了字符串上面,会多出一个\0
- 字符数组是c语言中的字符串,一定要以\0结尾!而且赋值时是’\0’!
- 字符串函数另外总结了一份。
char *s1="hello,world";
//相当于const char *s1,不能通过s1来修改字符
char s2[]="hello,world";
//相当于char *const s2,s2只能指向首地址,不能改变s2 的值
- 给地址加1,实际上是加了该指针指向的数据的大小。
- 数组的首地址就是指针,array[i]=*(array+i);
- 变长数组的申请方法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include <stdio.h>
#include<malloc.h>
void fun(int *address){
if(address==NULL){
return;
}
}
int main(){
int length;
scanf("%d",&length);
int *address=NULL;
int byte=sizeof(int)*length;
address=(int *)malloc(byte);
//malloc:给这个地址申请byte大小的地址。
//length是数组长度。
//并强制转化为指向int的指针。
for(int i=0;i<length;++i){
scanf("%d",address+i);
}
for(int j=0;j<length;++j){
printf("%d",*(address+j));
}
//上面是测试。
fun(address);
if(address!=NULL){
free(address);//记得free
address=NULL;
}
return 0;
}
void swap(int* a,int* b){
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}//第一种
int main(){
int a=1,b=2;
swap(&a,&b);
printf("%d\t%d\n",a,b);
a=a+b;
b=a-b;
a=a-b;//第二种
printf("%d\t%d\n",a,b);
a=a^b;
b=a^b;
a=a^b;//第三种
printf("%d\t%d\n",a,b);
}
- char *name[5](五个指向字符串的指针) is equal to char name[5][15]
char *str[5]={
"hello",
"world",
"monday",
"tursday",
"ok"
};
for(int i=0;i<5;++i){
printf("%s\n",str[i]);//注意这个!!!
}