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 我觉得不对,
按常量来推 应该是代表 这个数组更合适 。是在不同情况下编译器的对他的处理不一样而已。。。




