指针

#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\n",a);
	//a的值 
//	printf("%d\n",&a);
	//a的地址以十进制输出 
//	printf("%x\n",&a);
	//a的地址以16进制输出 
//	printf("%d\n",b);
	//b的值 
//	printf("%x\n",b);
	//b的值以十六进制输出 
//	printf("%x\n",&b);
	//b的地址以十六进制输出 
//	printf("%d\n",*b);
	//输出b储存的地址上的值 
//	printf("%d\n",++*b);
	 //*b代表的值加一 	
//	printf("%d\n",*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\n",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 
*/
posted @ 2021-10-24 21:32  Thomastine  阅读(54)  评论(0编辑  收藏  举报