精华内容
下载资源
问答
  • 本篇文章是对C语言指针赋值的问题进行了详细的分析介绍,需要的朋友参考下
  • C语言指针赋值

    2017-01-07 23:13:01
    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 = π

    此时的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语言指针赋值问题

    2020-08-21 11:46:43
    初始化的时候,右边表达式必须是地址 *Link = (LNode*)malloc(sizeof(LNode)),注意只有初始化才可以这样写 赋值的时候,*p = a;a是一个数值,而不是地址 出处

    初始化的时候,右边表达式必须是地址 *Link = (LNode*)malloc(sizeof(LNode)),注意只有初始化才可以这样写
    赋值的时候,*p = a;a是一个数值,而不是地址 出处

    展开全文
  • C语言指针赋值出错

    2020-04-23 08:52:20
    #include <stdio.h> int main() { int i = 5; int* p =&i; int* q; *q = *p; printf("%d\n",*q); return 0; }
  • <p><img alt="" height="446" src="https://img-ask.csdnimg.cn/upload/1612173951655.png" width="503" /></p>
  •  第一个疑问 :指针 指向和赋值 规范的正确操作方式是什么 目前我对指针的理解程度 指针大小8 但指向的内存区域可以操作 *p=a; 这是指针指向a的内存   p=&a; 这是把a的值赋给p 8...
  • C语言指针赋值0 NULL null 空指针

    千次阅读 2019-03-07 11:06:53
    思考一下对指针赋值为0会产生什么结果? 用编译器试验了一下 会得到一个空指针! 其实这种现象在C语言中是有定义的。 值为0的整形常数表达式或强制转换为void *类型的表达式可通过强制类型转换、赋值或比较操作...

    转自   https://blog.csdn.net/Xiejunyi12/article/details/50655606

    思考一下对指针赋值为0会产生什么结果?

    用编译器试验了一下 会得到一个空指针!

    其实这种现象在C语言中是有定义的。

    值为0的整形常数表达式或强制转换为void *类型的表达式可通过强制类型转换、赋值或比较操作转换为任意类型的指针

    其结果将产生一个空指针

    展开全文
  • 错误案例 #include <stdio.h> int main () { int *a; *a = 1; printf("%d", *a); return 0; } 原因分析:a没有初始化,所以不能赋值

    错误案例

    #include <stdio.h>
    int main () {
    	int *a;
    	*a = 1;
    	printf("%d", *a);
    	return 0;	   
    }
    

    原因分析:a没有初始化,所以不能赋值。

    展开全文
  • 以下代码运行会得到什么...#给指针变量所指的内存赋值 printf("%d",*k); } 答:以上代码运行未出现任何结果,为什么会出现这样结果呢?因为,int * k; 仅仅定义了一个指针变量并未给该指针一个明确的指向,但是*k...
  • 正确示范: main() { int a=3, *b=NULL; b=&a printf("%d", *b); } 错误示范: main() { int a=3, *b=NULL; *b=a; printf("%d", *b); }
  • C语言指针赋值0会产生什么结果?

    千次阅读 2016-02-12 22:22:05
    思考一下对指针赋值为0会产生什么结果? 用编译器试验了一下 会得到一个空指针! 其实这种现象在C语言中是有定义的。 值为0的整形常数表达式或强制转换为void *类型的表达式可通过强制类型转换、赋值或比较...
  • 深入理解C语言指针

    万次阅读 多人点赞 2019-09-28 08:36:51
    一、指针的概念 要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。...这段代码非常简单,就是两个变量的声明,分别赋值了 10、20。我们把内存当做一个酒店,而每个房间就...
  • C语言指针相互赋值

    2020-12-22 17:04:34
    C语言指针相互赋值 首先要记住指针变量和其他普通变量一样,使用前不仅要定义,还要进行赋值。未经赋值的指针变量不能使用,否则将会造成系统混乱,甚至死机。指针变量的赋值只能赋予地址 例如: #include <...
  • C语言指针间接赋值

    千次阅读 2018-02-07 17:16:04
    指针变量做形参时 N级指针的形参 为N-1级的指针实参赋值,即 修改一级指针的值,形参为二级指针,其他以此类催
  • c语言指针 不能直接赋值 指针初始化,必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空) /* 正确方法应该这样赋值 * 当然可以赋数组、字符串等等 */ int a =...
  • 指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。程序在运行过程中需要的是数据和指令的...
  • 为什么我用了强制转换还会出现这些问题,而且为什么每次运行,a的地址都不一样的 ``` #include #include void main() { int *p=NULL; int a = 10; printf("%d\n", &a); p =(int *) 0x0047abc;...
  • C语言指针赋值问题

    千次阅读 2015-04-21 20:06:16
    最近写了一个小程序,遇到一点小问题,是关于指向字符串的指针的。由此一发不可收拾,好奇心驱使我决定研究一下指针的初始化...初看起来,指针的初始化和赋值好像很混乱,又是*,又是&,时不时又出来一个数组
  • 1.任何指针变量都有两个属性:本身...指针赋值,简单应用。 #include int main(int argc, const char * argv[]) {  // insert code here...  int *p;  int b=10;  p=&b;  printf("%p %p\n",p,&b)
  • 中, 第三行 *cp 左值代表的是指针cp 指向的地址 ,赋值ch变量对应的地址,但是第四行同样是*cp作为左值 ,但是 为什么这里如果赋值&ch2就会编译错误呢,为什么*cp 同样作为左值,赋值给字符的地址,第三行通过,第四行 就...
  • C语言结构体赋值

    2020-09-20 11:54:21
    本文是我在工作中遇到的C语言结构体赋值以及C语言指针问题后的一些总结,希望可以对你有所帮助。 介绍: 先不做讲解,看看下面的代码,大家猜一下打印的值,看大家对C语言结构体赋值和结构体指针是不是了解: ...
  • C语言指针赋值问题

    2020-01-03 14:44:02
    请指出以下程序的错误: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 voidGetMemory(char **p,int num) ...&a...
  • 一、指针的概念要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一...}这段代码非常简单,就是两个变量的声明,分别赋值了 10、20。我们把内存当做一个酒店,而每个房间就是一块内存。那么...
  • 注意不能先定义再赋值: char a[10]; a[10] = “hello”; 这是错误的!!! 2.可以对数组中的字符逐个赋值: char a[10] = {‘h’,’e’,’l’,’l’,’o’}; 末尾的’\0’会自动补上; 3.可以利用strcpy: char ...
  • C语言字符指针赋值的问题

    千次阅读 2019-01-28 13:37:33
    1、定义的时候直接赋值: char arr[10] = {"kitty"}; 字符串: char arr[] = {"kitty"};或 char arr[] = "kitty"; 上面的初始化等价于:char c[5]={‘k’,’i’,’t’,’t’,’y...
  • //可以运行,(int*)的意思应该理解为:p是一个二级指针, p = &cc; //可以运行,结果同上 *p = cc ; //可以运行,结果同上 printf("cc = %d *p = 0x%x\n",cc,*p); //cc = 2; //编译通过,运行错误,因为cc被定义...
  • 常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值。 在C/C++中,....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,442
精华内容 1,376
关键字:

c语言指针赋值

c语言 订阅