数组
一般我们学习只谈论C99标准下的规定,因为其他的标准支持的语法太全了
比如C11下 int arr[n]={1,2,3,4,5,6,7,8,9}这个语法是合法的,编译器很智能的将数组的个数赋值给n。。。
数组定义时可以指定大小也可以不指定大小。
int arr[10]={1,2,3,4,5,6,7,8,9,0};//sizeof(arr)=40=4byte*10个
int arr[]={1,2,3,4,5,6,7,8,9,0};
一般来说变量 i j k都是为了循环步长做的准备,len,size,n标识符都是为了数组的长度做的准备。一定要注意代码的规范性,因为我们写程序第一显示要为了给别人看我们写的代码,第二才是你写的代码要实现那些的功能。
*和指针
*的三种意义 乘法 声明 解引用
int *p=NULL; *和变量名结合,不和类型结合。
在x86 即32位系统下 我们的指针的大小为4个字节。32bit/8=4byte
那么如果时64位的话那么就是8字节,具体来说还是要看你的IDE编译器时多少位的。
一个问题
int a = 10;
int *p = &a;
&*p是否和&a等价;;;
*&p是否等价于&a;;;
更具运算符的优先级和结合性表得知,*和&的优先是一样的,结合方向为自右向左结合,故
&*p==》&a;
*&p==》*(p的地址)==》p==》&a;
数组和指针作为函数参数
void PrintArray(int arr[10],int len);
void PrintArray(int arr[5],int len);
void PrintArray(int *arr,int len);
数组名退化为指针,故上面三种都等价于第三种void PrintArray(int *arr,int len);
char *str 和 char str[]的区别
1.
void main()
{
char *str1 = "C++";
char str2[] = "C++";
//str1[0] = 'c';
str2[0] = 'c';
return ;
}
以上代码中的str1[0]='c'编译可以通过但是执行的时候出错。该语句试图修改str1指向的字符的首个字符出现了错误。
原因在于:俩种方法对字符的数组操作的机制不同:
char *str1指向的时常量区的"C++",在常量去分配一块内存存储"C++",在栈上分配保存str1,所以修改.text区中的数据出现错误。
char str2[]表示在栈上开辟内存空间,将“C++“保存在了栈上,因此可以进行修改操作。
2.
//错误写法
char *get_str()
{
char str[]={"1234"};
return str;
}
//正确写法
char *get_str()
{
char *str={"1234"};
return str;
}
第一种因为数组定义在栈上,函数返回后栈空间被释放了。所以返回了的地址也是已经被释放的空间的地址。
第二种因为字符指针指向的是常量去的内容,是全局的,在编译的时候分配了内存在退出的程序的时候释放。所以是正确的。