#include <stdio.h>
//int max(int intArr[], int len) 不管有没有数组大小,
//int max(int intArr[6], int len)编译器都只会看作指针
int main(void) {
// int a = 1,e = 9,k = 5,*b = &a,*c = &a;
//指针变量名为b不是*b;定义多个指针每个都要带*
// printf("%d
",a);
//a的值
// printf("%d
",&a);
//a的地址以十进制输出
// printf("%x
",&a);
//a的地址以16进制输出
// printf("%d
",b);
//b的值
// printf("%x
",b);
//b的值以十六进制输出
// printf("%x
",&b);
//b的地址以十六进制输出
// printf("%d
",*b);
//输出b储存的地址上的值
// printf("%d
",++*b);
//*b代表的值加一
// printf("%d
",*b++);
//b储存的地址加一个单位(数据类型长度)
//先输出再加,*b++ == *(b++),不要因为括号误认为先执行b++
//但*++b是先执行++b
// int arr[10]={1,2,3,4,5,6,7,8,9},*p_arr = arr;
//*p_arr = &arr是错的
// printf("%d
",sizeof(arr)/sizeof(int));
//不能用sizeof(p_arr)/sizeof(int)求数组大小.
//sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数
//数组指针
//如要将二维数组赋给一指针,应这样赋值:
//int a[3][4];
//int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
//p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
//p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
//所以数组指针也称指向一维数组的指针,亦称行指针。
//指针数组 int *p[3];
//数组指针只是一个指针0变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。
//指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
char s[23] = "+6+",*p = NULL;
p = s;
//必须先被赋予字符串数组地址,空地址不行
scanf("%s",p);
//指针输入形式
printf("%s",p);
// 指针字符串输出形式
// scanf("%s",s);
// printf("%s",s);
return 0;
}
/*
指针类型与指针储存的地址上的值类型有关
指针类型与指针所占字节无关
32位计算机指针占4个字节
64位计算机指针占8个字节
指针b有b-1 == b储存的地址 - 1 * (*b的类型的长度)
数组a[i] == *(a + i);
数组a[i]与指向该数组的指针b有关系 a == p == &a[0]
字符数组存储在全局数据区或栈区,指针的字符串存储在常量区。
全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
char *str = "Hello World!";
str = "I love C!"; //正确
str[3] = 'P'; //错误
参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。
函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。
用n级指针不存n-1级指针地址容易出问题
int main()
{
char a[5]={'A','B','C','D'};
char (*p3)[5] = &a;
char (*p4)[5] = a;
return 0;
}
上面对p3 和p4 的使用,哪个正确呢?
p3+1 的值会是什么?p4+1 的值又会是什么?
毫无疑问,p3 和p4 都是数组指针,指向的是整个数组。
&a 是整个数组的首地址,a是数组首元素的首地址,其值相同但意义不同。
在C 语言里,赋值符号“=”号两边的数据类型必须是相同的,
如果不同需要显示或隐式的类型转换。p3 这个定义的“=”号两边的数据类型完全一致,
而p4 这个定义的“=”号两边的数据类型就不一致了。
左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针。
int func(int x); /* 声明一个函数
int (*f) (int x); 声明一个函数指针
f=func; /* 将func函数的首地址赋给指针f
*/