Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66190
  • 博文数量: 24
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-07 00:11
文章分类

全部博文(24)

文章存档

2014年(10)

2013年(7)

2012年(7)

我的朋友

分类: 嵌入式

2013-03-02 23:05:01

原文地址:C语言随笔笔记 作者:会笑的北极星

数组的首地址与第一个元素的首地址
 数组名代表数组首元素的地址
 数组的地址需要用数组名取地址符&才能得到
 数组首元素的地址值与数组的地址值相同
 数组首元素的地址与数组的地址是两个不同的概念
 
数组名的盲点
 只有在下列场合中数组名不能看做常量指针
   数组名作为sizeof操作符的参数
   数组名作为&运算符的参数

专题4-指针和数组(上)\视频\数组基础_P视频中的最后一个例子很经典

数组参数
 C语言中,数组作为函数参数时,数组作为函数参数时,编译器将其编译成对应的指针
 void f(int a[]); <==>void f(int* a);
 void f(int a[5]); <==>void f(int* a);
 结论:
 一般情况下,当定义的函数中有数组参数时,需要定义另一个参数来标示数组的大小。

数组小结
 数组是一片连续的内存空间
 数组的地址和数组首元素的地址意义不同
 数组名在大多数情况下被当成常量指针处理
 数组名其实并不是指针,,在外部声明时不能混淆
 
使用一行代码完成strlen函数
size_t strlen(const char *p)
{
 return (assert(), (*p) ? (strlen(p+1)+1) : 0)
}

size_t strlen(const char* s)
{
    size_t length = 0;
   
    assert(s);
   
    while( *s++ )
    {
        length++;
    }
   
    return length;
}

编写strcpy函数的写法:注意参数与返回值、和安全的考虑
#include
#include

char* strcpy(char* dst, const char* src)
{
    char* ret = dst;
   
    assert(dst && src);
   
    while( (*dst++ = *src++) != '\0' );
   
    return ret;
}

int main()
{
    char dst[20];
   
    printf("%s\n", strcpy(dst, "Delphi Tang!"));
   
    return 0;
}

motorola面试题; 

#include

int main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int* p1 = (int*)(&a + 1);
    int* p2 = (int*)((int)a + 1);
    int* p3 = (int*)(a + 1);
   
    printf("%d, 0x%x, %d\n", p1[-1], p2[0], p3[1]);
   
    return 0;
}

运行结合为:
 5, 0x2000000, 3 
 

定义数组类型
 C语言中通过typedef为数组类型重命名
  typedef type (name)[size]
  
 数组类型
  typedef int(AINT5)[5]
  typedef float(AFLOAT10)[10]
 数组定义
  AINT5 iArray;
  AFLOAT10 fArray;
 数组指针的定义
  ArrayType *pointer;
  也可以直接定义为:
  type (*pointer)[n]
 数组指针
  type * pArray[n];  

函数指针


指针阅读技巧解析
右左法则
 1.从最里层的圆括号中未定义的标示符看起
 2.首先往右看,,再往左看 再往左看
 3.当遇到圆括号或者方括号时可以确定部分类型,并调转方向
 4.重复2,3步骤,,直到阅读结束  

 


#include

typedef int(FUNC)(int);

int test(int i)
{
    return i * i;
}

void f()
{
    printf("Call f()...\n");
}

int main()
{
    FUNC* pt = test;
   
    void(*pf)() = &f; // 等价于为void(*pf)() = f;与数组名不一样,数组名a表示数组的第一个元素的地址,&a表示数组的地址。
   
    pf();      // 这两个函数效果是一样的。
    (*pf)();
   
    printf("Function pointer call: %d\n", pt(2));
}


#include

int main()
{
    /*
     * 函数指针,返回值为int型,两个参数一个为int *, int (*f)(int *)。其中int (*f)(int *)又为一个函数指针。
     */
    int (*p2)(int*, int (*f)(int*));


    /*
     * 函数指针数组,一个有5个元素的数组,数组中每个元素的类型为int(*)(int *),
     */
    int (*p3[5])(int*);
   
    /*
     * 数组指针,数组的类型为int(*)(int *),元素个数为5个的数组指针。
     */
    int (*(*p4)[5])(int*);
   
    /*
     * 函数指针,函数返回值为int(*)[5]的指针数组,参数为int *型。
     */   
    int (*(*p5)(int*))[5];
}
    

阅读(1339) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~