|
来源:顶嵌嵌入式培训
作者:顶嵌学员-员召伟
指针是c语言的重点,指针及地址,利用指针可以灵活的实现对变量地址的操作。C是强语言,在指针的应用中应特别注意被操作指针的类型,层次,的一致性。
程序说明:
1 #include
2
3 int main()
4 {
5 int *p[4];
6 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
7p[0]=a[0];
8p[1]=a[1];
10p[2]=a[2];
11printf("*p[0]=%d,a[0][0]=%d\n",*p[0],a[0][0]);
12printf("*p[1]=%d,a[1][0]=%d\n",*p[1],a[1][0]);
13printf("++(*p[0])=%d,a[0][1]=%d\n",++(*p[0]),a[0][1]);
14return 0;
15}
第5行定义了一个指针数组p,它的每个存储单元是一个指向int型的的指针,p应该就是一个指向指针的指针了。第6行对二维数组a初始化,11,12行,用p间接访问变量值。a在这里是一个数组类型的行地址,a[0]就应是一个列地址了,a[0][0]就是二维数组a的首行首单元的值了。13行,++(*p[0]),p[0]是指针数组的首单元的值,他是一个int型变量的地址,*p[0],是该int型变量的值,++(*p[0])就是对该整形变量值加1。
#include
int main()
{
char str[20]="0123456789";
char *p;
int a=strlen(str);
int b=sizeof(str);
int c=sizeof(p);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
该代码中,p的内存分配长度为1个字节,str[20]为1*20个字节。而字符串“0123456789”在str[]中应占11个字节(“123456789+’/0’“)。Sizeof是一个c的运算符,其结果是计算被操作量的内存分配大小。如int是4,char是1,double是8。Strlen()是一个测量字符串长度的函数,该字符串必须以’/o’结尾,否则,出错。因此上述代码中strlen(str)的值为10,sizeof(str)的值为20。Sizeof(p)的值为1。
#include
int main()
{
static char *a[3]={"CPU", "Computer", "Microprocessor"};
static char aa[3][15]={"CPU", "Computer", "Microprocessor"};
int i;
for(i=0;i<3;i++)
{
puts(a); // 以上用针数组实现
puts(aa); // 以上用二维字符数组实现
}
}
Static char *a[3]……行的初始化中,因为a的每个单元都是一个指针,则,按照,等号两边类型一致原则,该初始化中系统自动为3个字符串常量分配存储单元,并依次将其地址放在a的3个单元中。static char aa[3][15]……行,如上,等号两边类型一致,则左边只能放串值,又串在初始化中会自动在其尾加上一个’/0’符号,既标示串的结束,又是该变量之后的单元失效,在左边因aa是三层的二维数组,则,按行存储,因此右边的三个串就照应的了左边的三个层上了。这就是c的赋值过程。
#include
int max_value(int (*pa)[4], int row);
int main()
{
static int aa[3][4]={{1, 3, 5, 7},{2, 4, 6, 8},{20, 15, 32, 12}};
printf("max element is %d\n",max_value(aa, 3));
return 0;
}
int max_value(int ((*pa)[4], int row)
{
int i, j, m=pa[0][0];
for(i=0;i
for(j=0;j<4;j++)
if(pa[j]>m)
m=pa[j];
return(m);
}
该代码中主要注意三点:1,static,声明静态变量,用static声明的函数表示该函数只能被本模块(一般为该文件内)的函数调用。模块外不能,一般没有家static声明的函数默认为extended型(外部函数)及该文件外的函数只有通过函数声明就可用,用static声明的变同样有只使用于其模块内。2,注意int aa[3][4]={{1, 3, 5, 7},{2, 4, 6, 8},{20, 15, 32, 12}};这种赋值方式。3,max_value(aa, 3));在max-value调用中意味着int aa[3][4]与int (*pa)[4]类型匹配,如上定义,aa是一个行地址,行长4,p是一个指向行长为4的地址的指针,则aa与p匹配。
#include
void summary(int *p, int n);
int main()
{
static int a[11]={1,2,3,4,5,6,7,8,9,10};
summary(a,10);
printf("Sum is %d\n",a[10]);
return 0;
}
void summary(int *p, int n)
{
int s=0;
while (n--)
s+=*(p++);
*p=s;
}
该代码中注意while(n--)循环中n--的用法,n—是n先完成所参与的运算然后自加,++n是n先自加,然后参与运算。
#include
int getchoice(char **menu, int n);
int main( )
{
int chc;
static char *mn[5]={ "1. Input", "2. Copy",
"3. Move", "4. Delete",
"0. Exit"};
chc=getchoice(mn, 5);
if(chc>=0 && chc<5)
printf("You choice No. is %d\n",chc);
else
printf("Invalid choice!\n");
return 0;
}
int getchoice(char **menu, int n)
{
int i,choice;
for (i=0;i
puts(*(menu+i));
printf("\nInput ypur choice:");
return(getchar( )-'0');
}
该代码注意chc=getchoice(mn, 5);调用中mn与menu的类型匹配问题。
char *mn[5]mn是一个指针数组,mn的每个变量是一个指针,则mn就是指向指针的指针,**menu也是一个指向指针的指针,因此类型匹配。
总结:
C的学习核心是指针的掌握,指针这里有着重掌握指针的类型,层次,只有掌握了指针的类型与层次,才能真正的活用指针,才能真正的掌握C。
顶嵌学员:员召伟
2009年10月18日星期日
[ 本帖最后由 topembedded 于 2009-10-21 14:11 编辑 ]
|
|