您的位置:首页 > 编程语言 > C语言/C++

C语言深入

2015-08-30 10:08 585 查看
1.

/*

二维数组和指针

*/
int main()
{
//    int *p[3];//p是个指针的数组,3个元素,p[0],p[1],p[2],元素是 int *,指向int的指针;三个指针是相互独立的;如果没有初始化,都是野指针;
int a[2][3] = {{1,2,3},{4,5,6}};
//a由两个行数组构成,a[0],a[1];每个数组里面有三个元素;
int *q[2];//如果要访问a,每行一个指针指向首个元素,就可以去遍历a
//    q[0] = &a[0][0];//a[0][0]是a[0]数组的第一个元素,所以&a[0][0]=a[0];q[0]=a[0];
//    q[1] = &a[1][0];//a[1][0]是a[1]数组的第一个元素,所以&a[1][0]=a[1];q[1]=a[1];
for(int i=0;i<2;i++)
{
q[i] = a[i];//和上面个等价
}
//    q = a;//q和a两个都是数组,代表是数组的首地址,p是指针常量,不可改变;

//通过q来遍历二维数组;
//q[0]是a[0][0]的地址,
//q[0]+j是a[0][j]的地址
//*(q[0]+j)是a[0][j];

//遍历第一行
//    for(int j=0;j<3;j++)
//    {
//        printf("%d ",*(q[0]+j));
//    }

//通过q来遍历二维数组;
//q[i]是a[i][0]的地址,
//q[i]+j是a[i][j]的地址
//*(q[i]+j)是a[i][j];
//q[i]是q这个数组的第i个元素,q[i]=*(q+i);q可以看成是指向q[0]的常量指针;
//*(q[i]+j)=*(*(q+i)+j)
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("%d ",*(*(q+i)+j));
}
printf("\n");
}
}


2.

/*

通过指针数组来传递二维数组

求和;

int *p[]:传递的是指针数组的首地址

int len1:传递的是数组里指针的个数;行数

int len2:每个指针可以偏移的范围;访问的元素的个数;列数;

*/
int sumArray(int *p[],int len1,int len2)
{

//a[i][j]=*(*(p+i)+j)
int sum=0;
for(int i=0;i<len1;i++)
{
for(int j=0;j<len2;j++)
{
sum += *(*(p+i)+j);
}
}
return sum;
}
int main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int *q[2]={a[0],a[1]};//给q的两个指针赋值,都指向a的i行的第一个元素;

printf("%d\n",sumArray(q, 2, 3));
return 0;
}


3.

/*

数组指针:指向数组的指针

int (*p)[3];数组指针,就是一个指针;指向一个一维数组;一维数组的下标是3;数据类型是int

*/
int main()
{
int a[2][3] = {1,2,3,4,5,6};//两个行数组的数组;a[0],a[1];都是下标是3的一维数组
int (*p)[3];//p是一个指针,想指向一个下标是3的一维数组;a[0]和a[1]都是合适的对象;
//    p = &a[0]; //p指向a[0];指向一个行数组,可以认为是个行指针
//a[0]是数组a的第一个元素;a=&a[0];
p = a;//和上面等价;a的本质是常量指针,指向a[0],指向首个元素常量的常量指针,二维数组的名字,其实是个一维数组的常量指针;
//a[i]=*(p+i);p向后移动i行,取出内容a[i],是一个数组;
// a[i]+j = *(p+i)+j = &a[i][j];a[i]是一个行数组,可以看成是指向a[i][0]的常量指针,a[i]+j指向a[i][j]
//a[i][j] = *(a[i]+j) = *(*(p+i)+j)把指向的内容取出来;

//p 指向a[0]
//p+i 指向a[i]
//*(p+i) = a[i]=&a[i][0]
//*(p+i)+j = &a[i][j]
//*(*(p+i)+j) = a[i][j]
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("%d ",a[i][j]);
printf("%d ",*(a[i]+j));
printf("%d ",*(*(p+i)+j));
}
}
}


//通过数组的指针来传递二维数组

4.

/*

int (*p)[3]:数组指针,指向数组的一行

int len:表示行指针可以向后偏移几次,就是偏移的行数,就是二维数组的行数;

*/
int sumArray(int (*p)[3],int len)
{
int sum=0;
for(int i=0;i<len;i++)
{
for(int j=0;j<3;j++)
{
sum += *(*(p+i)+j);
}
}
return sum;
}
int main()
{
int a[2][3]={1,2,3,4,5,6};
int (*p)[3];//定义数组指针
p = a;//指向首行,
int sum=sumArray(p, 2);//a的本质是行指针,值也是相等的;
printf("%d ",sum);
return 0;
}


5.

/*

函数指针

*/
int add(int a,int b)
{
return a+b;
}
int main()
{
int (*pfunc)(int ,int );//pfunc就是一个函数指针;变量
pfunc = add;//函数名就是函数的入口地址;
printf("%d ",add(10,20));
printf("%d ",pfunc(10,20));//通过函数指针去调用函数
return 0;
}


6.

/*

回调函数:通过函数指针去传递函数,在这个函数里面需要通过指针去访问其他函数

*/

void printHello()
{
printf("hello\n");
}
void printWorld()
{
printf("world\n");
}
void printSth(void (*pfunc)(), int count)
{
for(int i=0;i<count;i++)
{
pfunc();
}
}
int main()
{
printSth(printHello,3);
printSth(printWorld,3);
return 0;
}


7.

/*

二级指针:

*/
int main()
{
int a=10;
int *p=&a;//p是个指针,指向的数据类型是int
int **pp;//是个指针,指向的数据类型是int *
pp = &p;//pp指向p,p是int *型
printf("sizeof(pp)=%lu\n",sizeof(pp));
/*
pp:修改pp指向,指向另一个指针;
*pp:修改p的指向,指向另一个int
**pp:修改p指向的内容,就是a的值;
*/
**pp = 100;
printf("*p=%d,a=%d\n",*p,a);
return 0;
}


void swap(int **x,int **y)
{
int temp = **x;
**x = **y;
**y = temp;
}
int main()
{
int a=10,b=20;
int *p = &a;
int *q = &b;
int **pp = &p;
int **qq = &q;
swap(pp,qq);
printf("a=%d,b=%d\n",a,b);
}


8.

//const 修饰符:只读的意思;

/*

*/
int main()
{
int value=10;
const int a=100;//a不能改;
//a++;//是错的
const int *p = &value;//p可以改,*p不能改;
p++;
//*p=1000;//错;
int const *m = &value;//m可以改,*m不可以改;
int *const n  = &value;//n不能改,*n可以改
const int *const q;//q不能改,*q也不能改
const int *const m1,*n1;//m1,*m1,*n1不能改,n1可以改

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息