• 指针与引用


    1.指针和引用的区别?

      1) 引用一定不为空,而指针可以为空。

       2)由于引用一定不为空,所以不需要做合法性检查,而指针去总要做合法性检查。

       3)引用有指针常量的性质,即引用不能修改其其引用的对象。

    2.问题2

       书上讲这样的语句是错误的。

    int *ptr;
    *ptr = 7;

    但是实际上我编译时并没有报错,TC和GCC编译都通过。


    3.指针问题

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void GetMem( char *p, int num )//错误 
    {
    	p = (char *)malloc( sizeof(char)*num );
    } 
    char* GetMem2( char *p, int num )
    {
    	p = (char *)malloc( sizeof(char)*num );
    	return p;
    } 
    int main(int argc, char *argv[])
    {
    	char *str=NULL, *str1=NULL;
    	
    	GetMem( str, 40 );
    	str1 = GetMem2( str1, 40 );
    	strcpy( str, "hello" );
    	strcpy( str1, "hello" ); 
    	printf( "%s\t%s", str, str1 ); 
    	return 0;
    }

    GetMem函数执行时,参数p指向str,但是之后p又指向一块新分配的内存,而str并未改变,所以内存分配失败。

    而GetMem2函数执行时,由于其有返回新分配内存的地址,所以给str1分配内存成功,所以可以向其复制字符串,而str复制字符串则程序将会崩溃。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char* GetHello()//错误 
    {
    	char str[] = "hello,world!"; 
    	return str;
    } 
    const char* GetHello2()//错误
    {
    	char str[] = "hello,world!"; //局部数组对应内存中的栈 
    	return str;
    }
    const char* GetHello3()//正确 
    {
    	char *str = "hello,world!"; //全局数组,对应于全局内存 
    	return str;
    } 
    const char* GetHello4()//正确 
    {
    	static char str[] = "hello,world!"; //全局数组,对应于全局内存 
    	return str;
    }
    int main(int argc, char *argv[])
    {
    	char *str=NULL, *str1=NULL;
    	
    	str = GetHello();
    	str1 = GetHello3();
    	printf( "%s\t%s\n", str, str1 ); 
    	return 0;
    }

    该例子中只有GetHello3,GetHello4是正确的,其他是错误的,虽然有的也会有正常结果。


    4.指针运算

    #include <stdio.h>
    int main(int argc, char *argv[])
    {
    	int a[5];
    	printf( "%d", &a[4]-a );
    	return 0;
    }

    上面的运行结果是4,指针想减的结果是指针值/指针大小,即如果有:

    #include <stdio.h>
    int main(int argc, char *argv[])
    {
    	int *p, *q;
    	int a=2, b=3;
    	p = &a;
    	q = &b;
    	printf( "p=%d\tq=%d\tp-q=%d\tq-p=%d\n", p, q, p-q, q-p );
    	return 0;
    }

    我的运行结果是:p=2359100       q=2359096       p-q=1   q-p=-1

    #include <stdio.h>
    int main(int argc, char *argv[])
    {
    	int *p, *q;
    	p = (int *)0x8000;
    	*p = 90;
    	printf( "p=%d\t*p=%d\n", p, *p);
    	return 0;
    }

    上述例子也是错误的,因为不允许给指针指定一个指定的地址。


    5.各种指针

       函数指针: 

    int (*func)( int );

       函数返回指针:

     int * func( void );

       指针常量:

     const int *

       常量指针:

     int * const 
    数组指针:

    int *ptr[10];
    //或者
    int *(ptr[10]);
    数组指针:

    int (*ptr)[10];



  • 相关阅读:
    38、面向对象设计模式之策略模式(Strategy)
    37、面向对象设计模式之代理模式(Proxy)
    36、面向对象设计模式之观察者模式(Observer)
    35、面向对象设计模式之抽象工厂(Abstract Factory)设计模式
    34、面向对象设计模式之工厂模式——简单工厂模式与工厂方法模式比较
    Chisel插件
    Git 常用命令
    oh_my_zsh
    一般xcode报错
    sqlite3 语法
  • 原文地址:https://www.cnblogs.com/arbboter/p/4225271.html
Copyright © 2020-2023  润新知