c语言来一个简单总结一下-->理清一些东西
程序代码:
Highlighting groups for various occasions ----------------------------------------- Syntax highlighting groups -------------------------- int main(int argc, char* argv[]) { int a[]={1,2,3,4,5,6,7,8,9,10}; int *p =a; a = p; return 0; } error C2440: '=' : cannot convert from 'int *' to 'int [10]' 【这里不是代表数组里面的十号元素 你要看到前面的int 代表长度为十 整形数组】 There are no conversions to array types, although there are conversions to references or pointers to arrays 可以看出来 a 是右值是代表数组首地址(第一个元素的地址) 左值时候:代表数组的首地址(一个数组的开始地址) 虽然值是一样 但代表意义是不同的。 比喻就像:大中国 和中国大 代表的就不一样了。 心得:数据类型名:1:告诉编译 这个数据地址在哪里 2:告诉编译器该数据需要的内存空间是怎么样的。 所以因为a 有时候代表的意思不一样 使我们有点难以用他。但只要我们记住了什么情况下 他代表什么意思,我们就可以驾驭他了。 所以 我们为什么不能给数组名 赋值的原因了。 当 a是左值的时候是代表这个数组的整体并不是代表一个变量 (数组可以想成一个集合) 怎么能够把一个一个变量赋值给一个集合呢! 比喻: 你可以赋值(说)一个人漂亮,但不你能赋值(说) 我来说A 在什么情况下代表的含义 int a[10]; a 代表一个长度10 的数组。 int *p = a; // 右值 时候代表 a[0]的地址 即 数组元素首地址 代表数据类型是 int a++. a的地址 + 4 a = p; // 不能通过编译的 a 代表 数组首地址 代表 一个长度10 的数组。代表数据类型int [10]; a++ . a地址+ (10*4)--->一个数组的长度 sizeof(a) a 代表 一个数组 所以是40 int main(int argc, char* argv[]) { int a[]={1,2,3,4,5,6,7,8,9,10}; // int *p =a; // a = p; printf("%d",sizeof(a)); return 0; } 输去是40 10 * 4(int) =40 可以看出来 a 这里代表是a 数组首地址 其实我更喜欢把a 看成一个数组 只是编译在不同情况对a 处理不一样而已。 按道理来说 int a[10]; int a; 都只是一个变量名而已。 不过数组变量名有特点些吧。 ---------------------------------------------------------------- #include "stdafx.h" #include <string.h> #include <STDLIB.H> #include <stdio.h> int main(int argc, char* argv[]) { //char str[][5]={"1234","4567","89qw"}; int str[][2] = {{1,2},{3,4},{5,6}}; // for(int i = 0; i<3; i++) // { // puts(str[i]); // } for(int j = 0; j<6;j++) { printf("%d",str[0][j]); } return 0; } 123456Press any key to continue 可以看出是 二位数组在物理上是一维。 从这里可以数据结构的美丽了, 数据结构是数据能够模拟出现实中的事物模式。 int main(int argc, char* argv[]) { //char str[][5]={"1234","4567","89qw"}; int str[][2] = {{1,2},{3,4},{5,6}}; int *p; p = str[0]; // 这里赋值成功说明是str[0] 是代表单个元素的地址 逻辑上第二行数组第一元素的地址。 并不是代表一维数组 //str[0] = p; error C2440: '=' : cannot convert from 'int *' to 'int [2]' 这里要是这样写的话 就会出现错误 这个和我们以为数组的a情况是一样的 所以我们都可以推出了. return 0; } sizeof(str[0]) == 2*4; *(&str[0] +1) 和 *(&a+1)是一样的。 ---------------------------------------------------------- 参数传值. int f(int b); int f(int *b); 的区别。 我说没有区别。 void f(int i) { printf("参数 i 的地址:%d\n",&i); } void f(int *i) { printf("参数 i 的地址:%d\n",&i); printf("i 的保存的地址: %d\n",i); } int main(int argc, char* argv[]) { int i = 119; printf("实参 i 的地址:%d\n",&i); int *j =&i; f(i); f(j); return 0; } 实参 i 的地址:1245052 参数 i 的地址:1244968 参数 i 的地址:1244968 i 的保存的地址: 1245052 Press any key to continue 可以看出来 参数 i 和外面的i 2个不同变量。 不过都在一个内存范围内。 所以不要搞混了, 以为给里面的i 改变了值 外面就改变了。 参数 就是申明一个变量等这你给他赋值, 但函数结束就释放该内存。 所以不要函数的内局部变量和参数变量地址当成返回值 因为该内存要被收回的。 这里总结自己一些以前容易弄错的部分,新手不明白的地方。 小鱼儿 2012 2,4 0:53 main() { inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); } 这题可以好好理解上面写, 推荐这本书 c语言深度剖析 里面我学到一些东西。 这题就是这里面的。。。。 作者说sizeof(a); 说应该是4 说是错误的。是vc6的BUG 我觉得不对, 按常量来推 应该是代表 这个数组更合适 。是在不同情况下编译器的对他的处理不一样而已。。。