指针
Pointer
指针类型决定了指针进行解引用时候能够访问的空间的大小,以及指针加减运算时可以跳过几个字节
int a = 0x11223344;
int* pa = &a;
*pa = 0;
//a : 00 00 00 00
char* pc = &a;
*pc = 0;
//a : 11 22 33 00
int* p;//4个字节
char* p;//1个字节
double* p;//8个字节
int* p;//0x00000000
p = p + 1;//0x00000004
char* p;//0x00000000
p = p + 1;//0x00000001
指针的加减整数和指针类型有关。
int arr[10];
int* pa = arr;//地址指向数组的首位。假如:0xnnnn00
pa+1;//其实是加了四个字节 0xnnnn04
char* pc = arr;
pc+1;//加了1个字节 0xnnnn01
指针-指针是中间元素的个数。
int arry[10];
arry[9]-arry[0];//9
int lenth(char* str){
char* start = str;
char* end = str;
while(*end != '\0'){
end++;
}
return end-start;S
}
二级指针
指向指针的指针
二级指针类型用type** 代表
第一个* 是一级指针类型,第二个* 才是二级指针的类型
(int) 指向一级指针的指针(一级指针的指针)
int a = 10;
int* pa = &a;
int** ppa = &pa;//二级指针
printf("%d\n",**ppa);//10
指针数组
首先指针数组是一个数组,是存放指针的数组。
对于语句“int*p1[5]”,因为“[]”的优先级要比“*”要高,所以 p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,而“int*”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。
int* p1[5]={&a,&b,&c,&d,&e};
//int型指针的长度为3的数组
int a=1;
int b=2;
int c=3;
int* arr[3]={&a,&b,&c};
数组指针
数组指针是一个指针,指向的是数组。
对于语句“int(*p2)[5]”,“()”的优先级比“[]”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,p2 是一个指针,它指向一个包含 5 个 int 类型数据的数组,如图 2 所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。
int (*p2)[5];
int arr[3]={1,2,3};
int (*pa)[3] = &arr;

浙公网安备 33010602011771号