输出结果:6
#include <stdio.h>
int main(void)
{
int a[2][2] = {{1,2}, {3,4}}
int b[2][2] = {{5,6}, {7,8}}
int (*p1)[2] = a
int (*p2)[2] = b
int (*q[2])[2] = {p1, p2} 这样才是正确的定义!
printf("%d\n", *(*q[1]+1))
return 0
}
但在tc2.0和bc3.1中提示非法初始化!
但把
int (*q[2])[2] = {p1, p2}
改成
int (*q[2])[2]
q[0] = p1
q[1] = p2
可以通过!
原因暂不清楚,估计是老旧的编译器不支持太复杂的定义!
其实最好的方法是使用typedef,简单明了,可读性大大提升!
#include <stdio.h>
int main(void)
{
typedef int (*PA)[2] 使用typedef
int a[2][2] = {{1,2}, {3,4}}
int b[2][2] = {{5,6}, {7,8}}
int (*p1)[2] = a
int (*p2)[2] = b
PA q[2]= {p1, p2} 这样可读性是否大大的增加?!
printf("%d\n", *(*q[1]+1))
return 0
}
tips: *号,可以指向指针类型内存地址上的值,&号,可以获取值类型的内存地址
每一个变量都有内存地址,可以通过变量来操作内存地址中的值,即内存的大小
go语言中获取变量的内存地址方法:通过 & 符号可以获取变量的地址
定义:普通变量存储的是对应类型的值,这些类型就叫值类型
变量b,在内存中的地址为:0x1040a124,在这个内存地址上存储的值为:156
定义:指针类型的变量存储的是⼀个地址,所以⼜叫指针类型或引⽤类型
b 是值类型,它指向的是内存地址上的值
a是指针类型,它指向的是b的内存地址
指针类型定义,语法: var 变量名 *类型
指针类型在定义完成后,默认为空地址,即空指针(nil)
在定义好指针变量后,可以通过***** 符号可以获取指针变量指向的变量
在这里的 *a 等价于 b,通过修改 *a ,最终修改的是值类型b的值
这里a,d是值类型,b,c是指针类型
d就相当于把a内存地址上值,在内存中从新开辟了一块空间存储,d和a互不影响
b,c相当于指向了a的内存地址,当使用*号引用出内存地址上的变量上,修改值得,a的值也会跟着改变