指针

---恢复内容开始---

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 arr1[20] = "hello";
 char arr2[10] = "world!!";
 char *p1 = &arr1[0];
 char *p2 = &arr2[0];
 while (*p1++);  //表示解引用获得其值,然后指针++
  //(*p1)++ 表示先解引用再++
 
 while (*p2)
 {
  *p1 = *p2;
  p1++;
  p2++;
 }
 for (int i = 0; i < 20; i++)
 {
  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)//形参必须为数组指针的形式,否则不能访问二维数组。
//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]);
  }
 }
}
void main()
{
 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));
}
 
10 const关键字保护数组内容
 

---恢复内容结束---

原文地址:https://www.cnblogs.com/jefy/p/9380139.html