Chinaunix首页 | 论坛 | 博客
  • 博客访问: 187516
  • 博文数量: 54
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2018
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-31 23:14
文章存档

2014年(2)

2013年(52)

分类: 嵌入式

2013-08-15 17:16:57

一:指针与一维数组 
    int a[10],b[2][2];
    printf("%p,%p",a,&a);
          打印出结果相同,那么这里a和&a的区别是什么?
    a是数组名是一个指针常量(不能进行自加..自运算)表示数组首地址。
    &a指向整个数组,打印出来的是整个数组的首地址,表示数组的宽度;从而有&a+1-&a=10;(指针相减表示相差的数据类型的个数);
    sizeof(a)=40;sizeof(&a)=4;   求一维数组宽度(类型)可以这样:sizeof(a)/sizeof(a[0]);

    一维数组进行参数传递时可以直接使用数组名形参。我们知道传参传的是值,要对传递的变量进行值改变就必须传递地址。下面将解释用数组名作形参的特点;
            有函数:main(){
                                int a[10];
                                fun(a);
                        }
                        void fun(int b[]){//形参数组名只是一个指针变量,不用申明长度,sizeof(a)=4;(指针的长度)
                                。。。
                                b[i]=b[i+1];//直接修改就能达到值改变;
                        }
            因为:数组名为指针变量,int b[]相当于*p;
                     而*p=a;则有p[i]=a[i](等价于*p[i]=a[i]);一维数组中[]实际上是变地址操作,即将p[i]按p+i计算地址然后按此地址找出地址单元中的值,即p[i]=a[i];
    
********************************************************************************************************************************
二: 指针与 二位数组  多级指针
     二位数组b[2][2]可以看成是两个一位数组b[0],b[1];       *b==b[0]
                                                                                 **b==b[0][0]
                                                                                 *(*(b+i)+j)==b[i][j];
     求二维数组宽度(类型)可以这样:sizeof(b[0])/sizeof(b[0][0]);sizeof(b[0])就是一位数组b[0]的字节宽度;

     小结:——:一维数组和二位数组部分初始化后,其余元素默认赋值0;
              ——:字符串存储时在末尾自动补\0;所以使用“”赋值时,必须定义长度为实际长度+1,a[]="abc",sizeof(a)=4;     a[]={'a','b','c'};sizeof(a)=3;

*******************************************************************************************************************************
三:指针
    ——:指针:int  a;char *p=&a;
            char *p=&a与*p=a;在定义时char *P中表示p是char *类型的,而不是*p=a;而在使用时*p则表示a的值;
    ——:指针可以相减p1-p2表示中间数据类型的个数,但不能进行相加p1+p2运算;
    ——:定义指针时常为*p=NULL;使用时强转p=(类型*)(地址);用完后注意free(p);且p=NULL;     
    ——:在应用中常常使用malloc,经常使用情况是函数调用中开辟空间用到二级指针,如形式:int main(*argc *argv[]){
                                                                                                                                    int *str;
                                                                                                                                    str=getmemory(&str,100);
                                                                                                                                    strcpy(&str,"hello world!");
                                                                                                                                    printf(“%s”,str);
                                                                                                                                    free(str);
                                                                                                                                    str=NULL;
                                                                                                                                    return 0;
                                                                                                                               }
                                                                                                                               void getmemory(int **str,int n){
                                                                                                                                    *str=(int *)malloc(n);
                                                                                                                                    aseert(*str);//判断是否为空
                                                                                                                                     return;
                                                                                                                               }
     ——:指针与函数:char * getmemory(。。。){ 。。}原理和上面强转相同,表示返回值是char *型(char型地址);

*******************************************************************************************************************************
四:const
    const修饰与他右面最近的元素;
                                   形式1:const int *p=&x;
                                              int const *p=&x;
                                              都表示p能改变,*p不能直接改变;const修饰int数据;
                                    形式2:int *const p=&x;
                                               与形式1相反,p不能直接改变,*p能改变;const修饰p;
                                    形式3:const int *const p=&a;
                                                综合了1与2;        
    
阅读(1248) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~