精华内容
下载资源
问答
  • 指针的初始化

    2014-07-22 11:50:25
     1、指针的初始化  指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。  对指针进行初始化时常用的有以下几种方式:

    指针代表的是内存单元的编号或地址,通过指针就可以找到对应的内存单元。对指针进行初始化或赋值的实质是将一个地址或同类型(或相兼容的类型)的指针赋给它,而不管这个地址是怎么取得的。

      1、指针的初始化

      指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。

      对指针进行初始化时常用的有以下几种方式:

      1.采用NULL或空指针常量,如:int *p = NULL;或 char *p = 2-2; 或float *p = 0;

      2.取一个对象的地址然后赋给一个指针,如:int i = 3; int *ip = &i;

      3.将一个指针常量赋给一个指针,如:long *p = (long *)0xfffffff0;

      4.将一个T类型数组的名字赋给一个相同类型的指针,如:char ary[100]; char *cp = ary;

      5.将一个指针的地址赋给一个指针,如:int i = 3; int *ip = &i;int **pp = &ip;

      6.将一个字符串常量赋给一个字符指针,如:char *cp = “abcdefg”;

      ANSI C定义了零指针常量的概念:一个具有0值的整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它可以用来初始化或赋给任何类型的指针。也就是说,我们可以将0、0L、'/0'、2–2、0*5以及(void *)0赋给一个任何类型的指针,此后这个指针就成为一个空指针,由系统保证空指针不指向任何对象或函数。

      ANSI C还定义了一个宏NULL,用来表示空指针常量。大多数C语言的实现中NULL是采用后面这种方式定义的:#define NULL ((void *)0)。

      例如:

      int a = 25;

      int *ptr = &a;

      int b[10];

      int *point = b;

      int *p = &b[0];

      2、指针的赋值

      int *p;

      int a;

      int b[1];

      p = &a;

      p = b;

      指针的赋值,“=”的左操作数可以是*p,也可以是p。

      当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;

      当“=”的左操作数是p时,改变的是p所指向的地址。

      常见错误:

      如果:int *p;

      *p = 7;

      则编译器(vs2008)会提示The variable 'p' is being used without being initialized.即使用了未初始化的变量p。

      因为p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。

      int k;

      int *p;

      p = &k; //给p赋值

      *p = 7; //给p所指向的内存赋值,即k= 7

      数组的变量名b表示该数组的首地址,因此p=b;也是正确的

      同类型的指针赋值:

      int val1 = 18,val2 = 19;

      int *p1,*p2;

      p1 = &val1;

      p2 = &val2;

    展开全文
  • C++指针的初始化和赋值

    千次阅读 2020-02-27 09:47:41
    指针的初始化和赋值 进度: 指针的初始化和赋值 指针变量的初始化 语法形式 存储类型 数据类型 *指针名=初始地址; 例: int *pa = &a; 注意事项 用变量地址作为初值时,该变量必须在指针初始化之前已声明过,...

    指针的初始化和赋值 进度:

    指针的初始化和赋值

    指针变量的初始化
    语法形式

    存储类型 数据类型 *指针名=初始地址;

    例:

    int *pa = &a;

    注意事项

    用变量地址作为初值时,该变量必须在指针初始化之前已声明过,且变量类型应与指针类型一致。

    可以用一个已有合法值的指针去初始化另一个指针变量。

    不要用一个内部非静态变量去初始化 static 指针。

    指针变量的赋值运算
    语法形式

    指针名=地址

    注意:“地址”中存放的数据类型与指针类型必须相符

    向指针变量赋的值必须是地址常量或变量,不能是普通整数,例如:

    通过地址运算“&”求得已定义的变量和对象的起始地址

    动态内存分配成功时返回的地址

    例外:整数0可以赋给指针,表示空指针。

    允许定义或声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。

    例: void *general;

    指针空值nullptr
    以往用0或者NULL去表达空指针的问题:

    C/C++的NULL宏是个被有很多潜在BUG的宏。因为有的库把其定义成整数0,有的定义成 (void*)0。在C的时代还好。但是在C++的时代,这就会引发很多问题。

    C++11使用nullptr关键字,是表达更准确,类型安全的空指针

    例6-5 指针的定义、赋值与使用
    //6_5.cpp

    #include

    using namespace std;

    int main() {

    int i; //定义int型数i

    int *ptr = &i; //取i的地址赋给ptr

    i = 10; //int型数赋初值

    cout << "i = " << i << endl; //输出int型数的值

    cout << "*ptr = " << *ptr << endl; //输出int型指针所指地址的内容

    return 0;

    }

    运行结果:

    i = 10

    *ptr = 10

    例6-6 void类型指针的使用

    #include

    using namespace std;

    int main() {

    //!void voidObject; 错,不能声明void类型的变量

    void *pv; //对,可以声明void类型的指针

    int i = 5;

    pv = &i; //void类型指针指向整型变量

    int *pint = static_cast<int *>(pv); //void指针转换为int指针

    cout << "*pint = " << *pint << endl;

    return 0;

    }

    指向常量的指针
    不能通过指向常量的指针改变所指对象的值,但指针本身可以改变,可以指向另外的对象。

    int a;

    const int *p1 = &a; //p1是指向常量的指针

    int b;

    p1 = &b; //正确,p1本身的值可以改变

    *p1 = 1; //编译时出错,不能通过p1改变所指的对象

    指针类型的常量
    若声明指针常量,则指针本身的值不能被改变。

    int a;

    int * const p2 = &a;

    p2 = &b; //错误,p2是指针常量,值不能改变

    展开全文
  • 指针的初始化和赋值

    千次阅读 多人点赞 2018-01-05 17:00:58
    1、指针的初始化 指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。此时,*p只是表示定义的是个指针变量,并没有间接取值的...
    1、指针的初始化

    指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。此时,*p只是表示定义的是个指针变量,并没有间接取值的意思。

    例如:

    int a = 25;

    int *ptr = &a;

    int b[10];

    int *point = b;   

    int *p = &b[0];

     

    如果:int  *p;

        *p = 7;

    则编译器(vs2008)会提示The variable 'p' is being used without being initialized.即使用了未初始化的变量p。

    因为p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。

    int k;

    int *p;

    p = &k;  //给p赋值

    *p = 7; //给p所指向的内存赋值,即k= 7

     

    2、指针的赋值

    int *p;

    int a;

    int b[1];

    p = &a; 

    p = b; 

    指针的赋值,“=”的左操作数可以是*p,也可以是p

    当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;

    当“=”的左操作数是p时,改变的是p所指向的地址。

    数组的变量名b表示该数组的首地址,因此p=b;也是正确的

     

    同类型的指针赋值:

     

    int val1 = 18,val2 = 19;

    int *p1,*p2;

    p1 = &val1;

    p2 = &val2;

    p1 = p2;   //注意啦,p1指向了val2,而没有指向val1



    备注:字符串与指针的初始化和赋值

    初始化:

    char *cp = "abcdefg"; //这个初始化过程,是将指针cp指向字符串的首地址,而并不是传递字符串的值。因为,在C语言里面,没有整体处理一个字符串的机制

    赋值:

    cp = "abcdefg";

    *cp=”abcdefg” ;//错误!字符串常量传递的是它的首地址,不可以通过*cp修改该字符串的值,因为该字符串为常量,而它只是简单的将指针指向该字符串常量

     

    3、指针常量

    在C语言中没有一种内建(built-in)的方法去表示指针常量,所以当我们使用它的时候通常先写成整型常量的形式,然后再通过强制类型转换把它转换成相应的类型,如:int * , double * , char *等。 所以后面所示的做法是不行的: int *p = 0x12345678 ; 正确的方式应为:int*p = (int *) 0x12345678; 要注意指针中只能存放地址,不能将一个非0值整型常量表达式或者其他非地址类型的数据赋给一个指针,原因就在此。在大多数计算机中,内存地址确实是以无符号整型数来表示的,而且多以16进制表示,但我们在C语言中不能用整型数去表示地址,只能用指针常量来表示,因为它是被用来赋给一个指针的。

    对于这个赋值问题还可以换一个角度去理解,在C语言中,使用赋值操作符时,赋值操作符左边和右边的表达式类型应该是相同的,如果不是,赋值操作符将试图把右边表达式的值转换为左边的类型。所以如果写出int *p = 0x12345678 ; 这条语句编译器会报错:'=' :cannot convert from ' const int ' to ' int * ' ,因为赋值操作符左边和右边的表达式的类型应该相同,而0x12345678是int型常量,p是一个指向int型的指针,两者类型不同,所以正确的方式是:int *p = (int *)0x12345678



    4、指针初始化补充

    ANSI C定义了零指针常量的概念:一个具有0值的整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它可以用来初始化或赋给任何类型的指针。也就是说,我们可以将0、0L、'/0'、2–2、0*5以及(void *)0赋给一个任何类型的指针,此后这个指针就成为一个空指针,由系统保证空指针不指向任何对象或函数。

    ANSI C还定义了一个宏NULL,用来表示空指针常量。大多数C语言的实现中NULL是采用后面这种方式定义的:#define  NULL  ((void *)0)。

    对指针进行初始化时常用的有以下几种方式:

      1.采用NULL或空指针常量,如:int*p = NULL;或 char *p = 2-2; 或float *p = 0;

      2.取一个对象的地址然后赋给一个指针,如:int i =3;  int *ip = &i

      3.将一个指针常量赋给一个指针,如:long *p = (long*)0xfffffff0;

      4.将一个T类型数组的名字赋给一个相同类型的指针,如:char ary[100]; char *cp = ary;

      5.将一个指针的地址赋给一个指针,如:int i =3;  int *ip = &i;int **pp = &ip;

      6.将一个字符串常量赋给一个字符指针,如:char *cp = “abcdefg”;

    对指针进行初始化或赋值的实质是将地址或同类型(或相兼容的类型)的指针赋给它,而不管这个地址是怎么取得的。要注意的是:对于一个不确定要指向何种类型的指针,在定义它之后最好把它初始化为NULL并在解引用这个指针时对它进行检验防止解引用空指针。另外,为程序中任何新创建的变量提供一个合法的初始值是一个好习惯,它可以帮你避免一些不必要的麻烦。



    5void *型指针

    ANSI C定义了一种void *型指针,表示定义一个指针,但不指定它指向何种类型的数据。void *型指针作为一种通用的指针,可以和其它任何类型的指针(函数指针除外)相互转化而不需要类型强制转换,但不能对它进行解引用及下标操作。C语言中的malloc函数的返回值就是一个void *型指针,我们可以把它直接赋给一个其他类型的指针,但从安全的编程风格角度以及兼容性上讲,最好还是将返回的指针强制转换为所需的类型,另外,malloc在无法满足请求时会通过返回一个空指针来作为“内存分配失败”的信号,所以要注意返回值指针的判空

     

    6、指向指针的指针

    在指针初始化的第5种方式中提到了用一个指针的地址来初始化一个指针。回忆一下上一讲的内容:指针是一种变量,它也有自己的地址,所以它本身也是可用指针指向的对象。我们可以将指针的地址存放在另一个指针中,如:

    int i = 5000;

    int *pi = &i;

    int **ppi = &pi;

    此时的ppi即是一个指向指针的指针,下图表示了这些对象:

                           

    i的地址为108,pi的内容就是i的地址,而pi的地址为104,ppi的内容即是pi的地址。对ppi解引用照常会得到ppi所指的对象,所获得的对象是指向int型变量的指针pi。想要真正地访问到i.,必须对ppi进行两次解引用,如下面代码所示:

    printf("%d", i );

    printf("%d", *pi );

    printf("%d", **ppi );

    以上三条语句的输出均为5000

    展开全文
  • C语言指针的初始化和赋值

    千次阅读 2019-04-16 14:02:17
    1、指针的初始化 指针初始化时,“=”的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空)。此时,*p仅仅是表示定义的是个指针变量,并没有间接...

    1、指针的初始化

     

    指针初始化时,“=”的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空)。此时,*p仅仅是表示定义的是个指针变量,并没有间接取值的意思。

    比如:

    int a = 25;

    int *ptr = &a;

    int b[10];

    int *point = b;   

    int *p = &b[0];

     

    假设:int  *p;

        *p = 7;

    则编译器(vs2008)会提示The variable 'p' is being used without being initialized.即使用了未初始化的变量p。

    由于p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。

    int k;

    int *p;

    p = &k;  //给p赋值

    *p = 7; //给p所指向的内存赋值,即k= 7

     

    2、指针的赋值

    int *p;

    int a;

    int b[1];

    p = &a; 

    p = b; 

    指针的赋值,“=”的左操作数能够是*p,也能够是p。

    当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;

    当“=”的左操作数是p时,改变的是p所指向的地址。

    数组的变量名b表示该数组的首地址,因此p=b;也是正确的

     

    同类型的指针赋值:

     

    int val1 = 18,val2 = 19;

    int *p1,*p2;

    p1 = &val1;

    p2 = &val2;

    p1 = p2;   //注意啦,p1指向了val2,而没有指向val1

     

    备注:字符串与指针的初始化和赋值

    初始化:

    char *cp = "abcdefg"; //这个初始化过程,是将指针cp指向字符串的首地址,而并非传递字符串的值。由于,在C语言里面,没有总体处理一个字符串的机制

    赋值:

    cp = "abcdefg";

    *cp=”abcdefg” ;//错误!字符串常量传递的是它的首地址,不能够通过*cp改动该字符串的值,由于该字符串为常量,而它仅仅是简单的将指针指向该字符串常量

     

    3、指针常量

     

    在C语言中没有一种内建(built-in)的方法去表示指针常量,所以当我们使用它的时候通常先写成整型常量的形式,然后再通过强制类型转换把它转换成对应的类型,如:int * , double * , char *等。 所以后面所看到的的做法是不行的: int *p = 0x12345678 ; 正确的方式应为:int *p = (int *) 0x12345678; 要注意指针中仅仅能存放地址,不能将一个非0值整型常量表达式或者其它非地址类型的数据赋给一个指针,原因就在此。在大多数计算机中,内存地址确实是以无符号整型数来表示的,并且多以16进制表示,但我们在C语言中不能用整型数去表示地址,仅仅能用指针常量来表示,由于它是被用来赋给一个指针的。

    对于这个赋值问题还能够换一个角度去理解,在C语言中,使用赋值操作符时,赋值操作符左边和右边的表达式类型应该是同样的,假设不是,赋值操作符将试图把右边表达式的值转换为左边的类型。所以假设写出int *p = 0x12345678 ; 这条语句编译器会报错:'=' : cannot convert from ' const int ' to ' int * ' ,由于赋值操作符左边和右边的表达式的类型应该同样,而0x12345678是int型常量,p是一个指向int型的指针,两者类型不同,所以正确的方式是:int *p = (int *) 0x12345678 ; 

     

    4、指针初始化补充

     

    ANSI C定义了零指针常量的概念:一个具有0值的整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它能够用来初始化或赋给不论什么类型的指针。也就是说,我们能够将0、0L、'/0'、2–2、0*5以及(void *)0赋给一个不论什么类型的指针,此后这个指针就成为一个空指针,由系统保证空指针不指向不论什么对象或函数。

    ANSI C还定义了一个宏NULL,用来表示空指针常量。大多数C语言的实现中NULL是採用后面这样的方式定义的:#define  NULL  ((void *)0)。

    对指针进行初始化时经常使用的有下面几种方式:

      1.採用NULL或空指针常量,如:int *p = NULL;或 char *p = 2-2; 或float *p = 0;

      2.取一个对象的地址然后赋给一个指针,如:int i = 3;  int *ip = &i;

      3.将一个指针常量赋给一个指针,如:long *p = (long *)0xfffffff0;

      4.将一个T类型数组的名字赋给一个同样类型的指针,如:char ary[100]; char *cp = ary;

      5.将一个指针的地址赋给一个指针,如:int i = 3;  int *ip = &i;int **pp = &ip;

      6.将一个字符串常量赋给一个字符指针,如:char *cp = “abcdefg”;

    对指针进行初始化或赋值的实质是将地址或同类型(或相兼容的类型)的指针赋给它,而无论这个地址是怎么取得的。要注意的是:对于一个不确定要指向何种类型的指针,在定义它之后最好把它初始化为NULL,并在解引用这个指针时对它进行检验,防止解引用空指针。另外,为程序中不论什么新创建的变量提供一个合法的初始值是一个好习惯,它能够帮你避免一些不必要的麻烦。

     

    5、void *型指针

     

    ANSI C定义了一种void *型指针,表示定义一个指针,但不指定它指向何种类型的数据。void *型指针作为一种通用的指针,能够和其他不论什么类型的指针(函数指针除外)相互转化而不须要类型强制转换,但不能对它进行解引用及下标操作。C语言中的malloc函数的返回值就是一个void *型指针,我们能够把它直接赋给一个其他类型的指针,但从安全的编程风格角度以及兼容性上讲,不妨将返回的指针强制转换为所需的类型,另外,malloc在无法满足请求时会通过返回一个空指针来作为“内存分配失败”的信号,所以要注意返回值指针的判空

     

    6、指向指针的指针

     

    在指针初始化的第5种方式中提到了用一个指针的地址来初始化一个指针。回顾一下上一讲的内容:指针是一种变量,它也有自己的地址,所以它本身也是可用指针指向的对象。我们能够将指针的地址存放在还有一个指针中,如:

    int i = 5000;

    int *pi = &i;

    int **ppi = &pi;

    此时的ppi即是一个指向指针的指针,下图表示了这些对象:

                              

    i的地址为108,pi的内容就是i的地址,而pi的地址为104,ppi的内容即是pi的地址。对ppi解引用照常会得到ppi所指的对象,所获得的对象是指向int型变量的指针pi。想要真正地訪问到i.,必须对ppi进行两次解引用,如以下代码所看到的:

    printf("%d", i );

    printf("%d", *pi );

    printf("%d", **ppi );

    以上三条语句的输出均为5000。

     

    https://www.cnblogs.com/mfrbuaa/p/3756342.html

    展开全文
  • C语言中指针的初始化和赋值

    千次阅读 2018-01-03 14:58:44
    1、指针的初始化 指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。此时,*p只是表示定义的是个指针变量,并没有间接取值的...
  • 指针的初始化总结

    2013-10-09 14:08:48
    1. 字符指针的初始化 在c语言中 "string"保存的就是首个字符所在的地址 所以可以把 字符串常量"string" 赋值给指针 char *p; p="string" 但不能把字符串常量直接赋给数组,需要用到 strcpy。 但可以对数组...
  • c语言指针的初始化赋值

    千次阅读 2013-03-13 23:06:37
    1、指针的初始化 初看起来,指针的初始化和赋值好像很混乱,又是*,又是&,时不时又出来一个数组。其实总结起来很简单: int *p; int a=25; int b[10]; int *m=&a; int *n=b; int *r=&b[0]; 指针的定义...
  • 1、指针的初始化 指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。此时,*p只是表示定义的是个指针变量,并没有间接取值的...
  • 1.指针的初始化指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以用整型的地址值(但是int *p=0;除外,该语句表示指针为空)此时,*p=只是表示定义的是个指针变量,并没有间接取值的...
  • 【c和指针学习笔记】函数指针的初始化以及函数调用的三种方式 2015年09月28日 21:29:20zyh_helen阅读数 3331 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • 字符指针的初始化

    千次阅读 2011-11-28 10:53:40
    字符指针的初始化(2006-8-4 16:04:00) 【收藏】 【评论】 【打印】 【关闭】 初学者经常被这个问题所困惑: char *p="abc"==>"abc"是一个const char*,为什么能够赋值给char *?   很多...
  • 在编译过程中,不能通过对没有初始化指针的引用, 没有初始化的指针,简称野指针,可能会乱指,指向一些无关紧要的区域问题是不大的,但是,如果指向一些重要的内存区域,就可能引起数据丢失。试想一下,你去遛狗...
  • C指针的初始化与赋值

    2012-03-23 10:22:55
    1、指针的初始化 初看起来,指针的初始化和赋值好像很混乱,又是*,又是&,时不时又出来一个数组。其实总结起来很简单: int *p; int a=25; int b[10]; int *m=&a; int *n=b; int *r=&b[0]; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,655
精华内容 11,062
关键字:

指针的初始化