• 指针


    #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 
    */
    
  • 相关阅读:
    Linux下openSSL安装并颁发证书
    js控制自动上传文件
    Swoole 4.5v安装使用
    Flask-SQLAlchemy 的基本使用
    Flask入门之二
    微信消息订阅
    Flask入门之一
    MySQL主从库快速搭建
    FastAPI连接mysql傻瓜式
    UOJ Round总结
  • 原文地址:https://www.cnblogs.com/Thomastine/p/15455806.html
Copyright © 2020-2023  润新知