标题:c语言来一个简单总结一下-->理清一些东西
只看楼主
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
结帖率:95.74%
 问题点数:0 回复次数:3 
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 053




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 我觉得不对,
按常量来推 应该是代表 这个数组更合适  。是在不同情况下编译器的对他的处理不一样而已。。。
搜索更多相关主题的帖子: c语言 东西 groups 
2012-02-24 01:01
杨松松
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:98
专家分:142
注 册:2011-12-3
得分:0 
总结的挺好的,现在在回校的火车上,去了再仔细看看
2012-02-24 11:46
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:0 
小鱼儿兄弟辛苦啦

                                         
===========深入<----------------->浅出============
2012-02-24 15:48
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
得分:0 
只是把自己一些基础知识理清一下。

用心做一件事情就这么简单
2012-02-24 21:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-361504-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.231441 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved