> 指针就是地址,地址就是指针
int a = 1;
int *p;
p = &a; //等价于int *p = &a
//p、&a是int*,*p、a是int
- 指针变量也有地址,只是每次运行随机分配不固定!!!!
- 指针变量++,类似于int a,a++。不会改变指针变量本身的地址,只会改变指针变量这块地址上存放的地址
- 指针加减根据char* int* 程度不同,比如char* 一次就加1,因为字符占一个字节,所以指针存放的地址只需要+1即可
- 指针相减的值等于地址差/指针类型字节,例如int* 的0x000004 - 0x000000,结果为1
> 字符串指针是最最最最特殊的!!
//一般情况
int arr[] = {1, 2, 3};
int *p = arr; // 将指针指向数组的首地址
char *p = "abcdefg";
- 正确,因为人家是关系户!!!tmd,注意不可以通过p改变字符串常量的地址就行,p存放该字符串(实际上是字符数组)首地址
- 可以理解为“abcde”类型是const char*
> 数组名相关
int arr[10];
int *p = arr;
//arr + i == &arr[i] == p + i == &p[i] 都是地址!!!!!
//*(arr+i) == arr[i] == *(p+i) == p[i] 都是值!!!!也就是说,p就是arr了!!!
//&arr表示整个数组的地址,可以通过sizeof验证
int (*parr[10])(int ,int);
//表示存放了十个函数指针的数组,换句话说,就是一个数组,数组里存放的指针,怎么看出来的呢?*parr[10]!!!
什么指针呢?指向函数的指针!怎么看出来的呢? int *()是函数指针!
> 指针数组or数组指针?
总结:去掉指针变量得到指针的类型,再去掉 得到指针指向的数据的类型*
> 64位系统下指针为什么是八字节?
- 因为64=64位2进制001010101010101...共64个 = 8字节,而且指针里存放的就是这样一个64位八进制数,占用8字节
> 野指针
- 也可能是没有赋初值、数组越界、malloc使用后没有free并置空
>二维数组的数组名是指针吗?
int arr[3][5],arr 是一个指向一维数组的指针,即 int (*arr)[5],可以对其+1,表示指向下一行
&arr 是一个指向arr的指针,即 int (**p)[5]
* arr 是对arr解引用,表示一维数组,如*(arr+2)表示第二行等价于arr[2]!!!因此可以通过*(arr+2)+2读取arr[2][2];
int (p)[5] 和 intp[5]
int (*p)[5] 小括号优先,表示p是一个指针,指向int[5]的数组
int*p[5] 中括号优先,表示p是一个数组,数组中每个元素的类型都是int*
参数传递
int* arr[5] 作为入参时,arr会退化为首地址,地址也就是指针,所以可以作为int** 形参的入参 反之不可以!!!
int* p 和int arr[] 正反都可以做对方的入参
二维数组不可以省略列,即int arr[5][]是不可以的!!
我的主要误区解答!!不是带* 一定是解引用,也可以表示它是个指针变量!!!
函数指针
函数名、&函数名都可以表示函数的地址
标签:arr,int,地址,64,数组,指针 From: https://www.cnblogs.com/xsl-blogs/p/17623111.html