文档介绍:1
《C 和指针》
《C 专家编程》
《C 陷阱与缺陷》
《C 语言编程要点》
总 结
1
说明:总结的学问点主0 的元素。由于 calendar[4] 是一个数组,我们可以通过下标的形式来指定这个数组中的元素: i = calendar[4][7],这个语句也可以写成 下面这样而表达的意思保持不变: i = *( calendar[4] + 7 ),还可以进一步写成: i = *( *( calendar + 4 ) + 7 )。
下面我们再看: p = calendar; 这个语句是非法的,由于 calendar 是一个二维数组,即“数组的数组”,在此 处的上下文中使用 calendar 名称会将其转换为一个指向数组的指针。 而 p 是一个指向整型变量的指针, 两个指 针的类型不一样,所以是非法的。明显,我们需要一种声明指向数组的指针的方法。
4
int calendar[12][31];
int (*monthp)[31];
monthp = calendar;
int (*monthp)[31] 语句声明的 *monthp 是一个拥有 31 个整型元素的数组,因此, monthp 就是一个指 向这样的数组的指针。 monthp 指向数组 calendar 的第一个元素。
指针与数组 2(c .)
· 1 、数组的名的值是一个指针常量,不能试图将一个地址赋值给数组名;
·2、当数组名作为 sizeof 操作符的操作数时, sizeof(arrayname)返回的是整个数组的长度,而不是指向数组的指
针的长度; ·3、当数组名作为单目操作符&的操作数,取一个数组名的地址所产生的是一个指向数组的指针,而不是一个
指向某个指针常量值的指针。
·4、指针和数组并不总是相等的。为了说明这个概念,请考虑下面这两个声明:
int a[5];
int *b;
a 和 b 能够互换吗?它们都具有指针值,它们都可以进展间接访问和下标操作。但是,它们还是有很大的区 别的:声明一个数组时,编译器将依据声明所指定的元素数量为数组保存内存空间,然后再创立数组名,它 的值是一个常量,指向这段空间的起始位置。声明一个指针变量时,编译器只为指针本身保存内存空间,它 并不为任何整型值安排内存空间。 而且, 指针变量并未被初始化为指向任何现有的内存空间, 假设它是一个 自动变量,它甚至根本不会被初始化。把这两个声明用图的方法表示,可以觉察它们之间存在显著的不同:
a
b
?
因此,上述声明后,表达式*a 是完全合法的,但表达式*b 却是非法的。 *b 将访问内存中某个不确定的位 置,或者导致程序终止。另一方面,表达式 b++可以通过编译,但是 a++却不能,由于 a 的值是一个常 量。
#include<>
int main()
{
//留意 sizeof(num)的长度应当为 10*4=40
int num[] = {0,1,2,3,4,5,6,7,8,9};
printf(“ sizeof(num) = %d\n“, sizeof(num) );
//留意 sizeof(str)的长度应当为 11,包括字符串后面的”\0”
char str[] = “0123456789“;
printf(“ sizeof(str) = %d\n“, sizeof(str) );
//留意 sizeof(str1)的长度应当为 10,不包括字符串后面的”\0”,但是,最好将字符串的最终一个字符设定为空
char str1[] = {”0”,”1”,”2”,”3”,”4”,”5”,”6”,”7”,”8”,”9”};
printf(“ sizeof(str1) = %d\n“, sizeof(str1) );
//&num 的类型为”int (*)[10]”,表示的是一个指向长度为 10 的整形数组的指针
int (*ptoint)[10] = &num;
printf(“ sizeof(ptoint) = %d, (*ptoint)[9] = %d\n“, sizeof(ptoint), (*ptoint)[9] );
//&str 的类型为”char (*)[11]”,表示的是一个指向长度为