---恢复内容开始---
1.指针的兼容性
指针类型和指针指向的类型应当是一致的,例如:int类型的指针指向float类型数据会报错。
数组名称是指向数组的指针,即:和数组首元素的地址相同。
int *p ;
char c = ‘a’;
p = & c;//int 类型的指针指向4个字节的内存空间,char只有一个字节,所以剩余的3个字节全部生成随机数
int a = 10;
char *p = &a;//指针p指向a这块内存空间的首地址;
2.常量指针和指针常量
const int *p;
int a = 10;
p =&a; //*p = 12错误,因为指针指向的是一个常量,不能使用指针修改其值。
int *const p ;
int b = 10;
p = &a;
*p ==10;*p = 20;//常量指针能够读取指向的值,也能修改指向的值
p = &b//错误 因为常量指针不能改变其指向。
网络传输过程中IP地址总是以4个字节表示;通过int a及char类型指针遍历。
3.字符数组合并
char arr2[10] = "world!!";
char *p2 = &arr2[0];
while (*p2)
{
*p1 = *p2;
p1++;
p2++;
}
{
printf("%c", arr1[i]);
4.指针数组
short *p[10];
char *p2[10];
int *p1[10]; sizeof(p1)==sizeof(p)==sizeof(p2)//因为不管什么类型的指针,其大小都是4个字节。两个数组都是10个指针,即:40个字节。
5.二级指针
int *p = 10;//p是一个野指针,因为p没有指向任何内存地址。
int a = 10;
int *p1 = &a;
int **pp1 = &p;
int ***ppp1 = &pp1;
a = ppp1;//ppp1存储的是pp1的地址。
***ppp1==10;
6.指针数组和数组指针
int *arr[10];//指针数组,表示数组中保存着10个指针。
int(*a)[10];//数组指针,表示指向含有10个int类型元素的指针。
数组指针:一个指针指向数组;当解引用指针得到指针指向的这个数组,数组和指针之间可以相互的转换;
7.交换两个数据变量的值
void Change(int *a ,int *b)
{
int temp = *a ;
*a = *b;
*b = temp;
}
void main()
{
int a = 10;
int b = 20;
Change(&a ,&b);
}
8.一维数组作为函数参数的使用方法
void test(int buf[]){}; 等价于 void test(int *buf);buf都表示一个指针变量。
9.将二维数组作为函数参数传递
//void test(int p[][10] ,int r ,int c)//等价形式
{
for (int i = 0; i <r; i++)
{
for (int j = 0; j < c; j++)
{
printf("%d", p[i][j]);
}
}
}
{
int arr[4][10] = { { 1, 2, 3, 5, 6, 7, 8, 9, 0 }, { 2, 3, 5, 5, 7, 8, 9, 7 }, { 2, 3, 5, 6, 78, 9, 0, 0, 9 }, { 1, 2, 3, 5, 6, 78, 98, 9 } };
test(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0])/ sizeof(int));
}
---恢复内容结束---