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]);
}