现在的位置: 首页 > 综合 > 正文

嵌入式驱动开发的前期Linux 和 C学习(十)

2014年02月09日 ⁄ 综合 ⁄ 共 1803字 ⁄ 字号 评论关闭

1)指针与“指针的指针”(二级指针)概念以及它们之间的区别。
在有些书里面会说“指针就是地址”,在这里笔者不同意这句话!指针是一个变量,指针存放的是地址,不能说指针就是地址!
指针变量:指针式修饰词,其本质是一个变量。
变量指针:变量是修饰词,其本质是一个指针。

2)怎样通过指针数组来访问二维数组,通过数组指针来访问二位数组.
如果我们有一个二维数组 int  a[3][3],  定义一个一维指针 int   *p=a; 下面我们说一下应用p 指针访问数组元素:
通过前面的资料我们可以知道数组的数组名表示数组的首地址,所以我们可以得出 p 存放的值是数组a的首地址!我们可以使用指针表示数组的元素
a[0][0] : *(*(a+0)+0) == **a;
a[0][1] : *(*(a+0)+1); a[1][2] : *(*(a+1)+2)
a+1: 表示第二行的行首地址;
*(a+1):表示第二行的第一个元素的地址 *(a+1)+2:表示第二行的第三个元素的地址
*(*(a+1)+2)则表示第二行的第三个元素的值

3)atoi、sprintf库函数、掌握简单的gdb调试。
1.atoi(argv[1])    把argv[1]这个字符串 转化为 整型;
2.sprintf()  
 
int i=1234;
char a[100];

sprintf(a,"%d",i);    //把整形i 转化为字符串
3.gdb 调试
(1) gcc -g test.c -o test
(2) gdb ./test
(3) 进入gdb模式后,输入start 开始调试,输入 s 确定当前的步骤

4)Char *ptr = “1234”;注意atoi(ptr)与(int)(*ptr)的区别.

5)函数指针,函数的名字是函数的代码段开始的地址

6)注意在分配内存后要通过free来释放手动分配的内存.

编程例题:
1.用子函数实现分配内存,掌握二级指针的使用
#define N 5

int mallocmem(int **ptr1,int num)
{
if(ptr1 == NULL)
{
return -1;
}
*ptr1 = (int*)malloc(num);

if(*ptr1 == NULL)
{
return -1;
}
bzero(*ptr1,num);
return 0;
}

int main()
{
int *ptr=NULL,i,ret;

ret = mallocmem(&ptr,N*sizeof(int));
if(ret != 0)
{
return 1;
}
for(i = 0;i<N;i++)
{
*(ptr+i) = i;// ptr[i] = i;
}
for(i = 0;i<N;i++)
{
printf("%d\n",ptr[i]);
}
free(ptr);
ptr = NULL;
}
2.通过数组指针分配并访问数据元素。
int main()
{
int (*ptr)[3],i,j;//掌握ptr和ptr+1的意义

  ptr = (int (*)[3])malloc(2*3*sizeof(int));

for(j=0;j<2;j++)
for(i = 0;i<3;i++)
ptr[j][i] = i+j;//*(*(ptr+j)+i)=i+j;
for(j=0;j<2;j++)
for(i = 0;i<3;i++)
printf("%d\n",ptr[j][i]);
}

3.掌握函数指针的定义方法
void swap(int *i,int *j)
{
int n;
n=*i;
*i = *j;
*j = n;
}

int main(int argc,char *argv[])//等价于int main(int argc,char **argv),注意这里argv不是数组,而是一个二级指针 
{
void (*fun)(int*,int*)=swap;//定义一个函数指针,并赋初值
(*fun)((int*)argv[1],(int*)argv[2]);
printf("%d,%d\n",(atoi)(argv[1]),atoi(argv[2]));

return 0;
}
4.掌握指针数组的使用方法
int main()
{
int *ptr[2],i,j;

for(i=0;i<2;i++)
ptr[i] = malloc(3*sizeof(int));

for(i=0;i<2;i++)
for(j=0;j<3;j++)
ptr[i][j] = i+j;

for(i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%d\n",ptr[i][j]);

for(i=0;i<2;i++)
free(ptr[i]);
 
}

抱歉!评论已关闭.