分类: 嵌入式
2013-03-01 12:23:16
数组的首地址与第一个元素的首地址
数组名代表数组首元素的地址
数组的地址需要用数组名取地址符&才能得到
数组首元素的地址值与数组的地址值相同
数组首元素的地址与数组的地址是两个不同的概念
数组名的盲点
只有在下列场合中数组名不能看做常量指针
数组名作为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];
}