-
2019-12-19 21:57:36
指针变量的初始化——必须先赋值后使用
- 在指针变量定义或者初始化时,变量前的* 只能表示是个指针变量。
- 把一个变量的地址作为初始化值时,该变量必须在此前进行定义。
- 可以用初始化的指针变量给另一个指针变量作初始化值。
- 不能用数值作为指针变量的值,但可以将一个指针变量初始化为一个空指针。
- 指针变量定义是的存储单元和它所指向的目标变量的数据类型必须一致。
例如:
int *p=1000; 是不对的 而 int *p=0;是对的。
#include<stdio.h> void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py); int main() { int a=1,b=2; int *pa=&a,*pb=&b; //px存放a的地址,pb存放b的地址 swap1(a,b); printf("After calling swap1: a=%d b=%d\n",a,b); a=1; b=2; swap2(pa,pb); printf("After calling swap2: a=%d b=%d\n",a,b); a=1; b=2; swap3(pa,pb); printf("After calling swap3: a=%d b=%d\n",a,b); return 0; } void swap1(int x,int y) { int t; t=x;//变得是x和y的值,当调回主函数时,swap1中定义的变量销毁了 所以不改变a和b的值。 x=y; y=t; } void swap2(int *px,int *py) { int t; t=*px; //通过*符号,改变了px和py指向的值,a,b的存储单元也变了, 所以a,b的值也变了。 *px=*py; *py=t; } void swap3(int *px,int *py) { int *pt; pt=px;//改变的时px,py形参指针的值,没有*,px,py不会指向a,b。 所以a,b的之没变。 px=py; py=pt; } 结果: After calling swap1: a=1 b=2 After calling swap2: a=2 b=1 After calling swap3: a=1 b=2
更多相关内容 -
结构体指针变量初始化问题
2020-12-08 17:52:08我的理解: 1,如果定义一个结构体指针变量,就一定要为这个结构体指针变量赋值一个有效的地址,否则因为结构体指针变量地址不明确,那之后得到的结构体成员值也不明确。 2,定义结构体变量而不是指针不会出现问题...1,以下代码是有问题的:
//file1.c里有如下代码 struct innrtc_t { u8 it_works_timer; u8 lose_effect_timer; u16 target_temputer; u16 wakeup_period; u32 start_time; u32 stop_time; float line_slope; }; void innrtc_init(struct innrtc_t *rtc) { innrtc->it_works_timer = 0; innrtc->lose_effect_timer = 0; innrtc->target_temputer = 0; innrtc->wakeup_period = 0; innrtc->start_time = 0; innrtc->stop_time = 0; innrtc->line_slope = 0.0; } //file2.c中有如下代码 struct innrtc_t *innrtc; innrtc_init(innrtc);
这段代码不能初始化innrtc这个结构体成员,原因是因为初始化的这些值只是对指针赋值,并没有赋值到指针地址下的变量。innrtc相当于野指针。
2,下面的代码是正确的:
//file1.c代码不变 //file2.c代码如下 struct innrtc_t innrtc; innrtc_init(&innrtc); //或者 struct innrtc_t *innrtc; innrtc = (struct innrtc_t *)malloc(sizeof(struct innrtc_t)); if(innrtc == NULL) { //... ... } innrtc_init(&innrtc); // ... ... free(innrtc);
我的理解:
1,如果定义一个结构体指针变量,就一定要为这个结构体指针变量赋值一个有效的地址,否则因为结构体指针变量地址不明确,那之后得到的结构体成员值也不明确。
2,定义结构体变量而不是指针不会出现问题的原因,定义结构体变量编译器会明确的把这个结构体变量分配到栈中,同样使用malloc来申请一块内存,编译器会明确的把结构体指针分配到堆中,这都是有效地址,所以不会出错。 -
C语言指针的初始化以及什么是空指针和void指针
2021-05-23 11:42:27指针初始化具有动态存储周期的指针变量,开始是没有定义值的,除非它们在声明的同时进行了显式地初始化。在语句块内定义的所有变量,只要没有被声明为 static,就具有动态存储周期。所有指针在定义时如果没有初始化...指针(pointer)是对数据对象或函数的一种引用。指针有多种用途,例如定义“传址调用”函数,它还可以实现动态数据结构,例如链表和树。接下来我们来介绍如何初始化一个指针。
指针初始化
具有动态存储周期的指针变量,开始是没有定义值的,除非它们在声明的同时进行了显式地初始化。在语句块内定义的所有变量,只要没有被声明为 static,就具有动态存储周期。所有指针在定义时如果没有初始化,则空指针默认作为它们的初始化值。
可以用下列方式来初始化一个指针:
(1) 一个空指针常量。
(2) 指向相同类型的指针,或者指向具有较少限定符修饰的相同类型。
(3) 如果需初始化的指针不是函数指针,可以使用 void 指针进行初始化(同上,需初始化的指针可以是指向具有更多限定符类型的指针)。
指针如果不具有动态存储周期,则必须用常量表达式来初始化,例如取址运算的结果,或者使用数组或函数的名称。
当初始化指针时,除非是上面说明的情况,否则不会发生隐式类型转换。然而,可以将一个指针值显式地转换成另一个指针类型。例如,若想一个字节接着一个字节地读取对象,可以将其地址转换成 char 指针,指向此对象的第一个字节:
double x = 1.5; char *cPtr = &x; // 错误:类型不匹配;没有隐式转换 char *cPtr = (char *)&x; // 正确:cPtr指向x的第一个字节
所有指针在定义时如果没有初始化,则空指针默认作为它们的初始化值。如果需初始化的指针不是函数指针,可以使用 void 指针进行初始化。那么什么是空指针和 void 指针呢?
空指针
当把一个空指针常量转换为指针类型时,所得到的结果就是空指针(null pointer)。空指针常量(null pointer constant)是一个值为 0 的整数常量表达式,或者是一个 void* 类型的表达式。在头文件 stdlib.h、stdio.h 以及其他头文件中,宏 NULL 被定义为空指针常量。
空指针有别于其他指向对象或函数的有效指针。因此,当返回值为指针的函数出现执行失败的情况时,它通常会使用空指针作为返回值。标准函数 fopen()正是这样的一个例子,如果在指定的模式下打开某文件失败时,该函数会返回一个空指针。
#include /* ... */ FILE *fp = fopen( "demo.txt", "r" ); if ( fp == NULL ) // 也可以被写成:if ( !fp ) { // 错误:无法打开demo.txt文件进行读取 }
如果有必要的话,空指针会被隐式地转换成其他指针类型,以进行赋值运算或者是进行 == 或 != 的比较运算。因此,上述例子不需要使用转型运算符。
void 指针
指向 void 的指针,或者简称为void 指针(void pointer),是类型为 void* 的指针。因为没有对象类型是 void,所以void* 被称为万能指针类型。换句话说,void 指针可以代表任何对象的地址,但不代表该对象的类型。若想获取内存中的对象,必须先把 void 指针转换为合适的对象指针。
若想声明一个可以接收任何类型指针参数的函数,可以将所需的参数设定为指向 void 的指针。当调用这样的函数时,编译器会隐式地将对象指针参数转换成 void 指针。常见的例子如标准函数 memset(),它被声明在头文件 string.h 中,其原型如下:
void *memset( void *s, int c, size_t n );
函数 memset()将 c 的值赋值到从地址 s 开始的 n 个内存字节中。例如,下面的函数调用会将 0 值赋值到结构变量 record 中的每个字节:
struct Data { /* ... */ } record; memset( &record, 0, sizeof(record) );
实参 &record 具有 struct Data* 类型。在函数调用中,实参被转换成形参类型,即 void*。
编译器会在必要的地方把 void 指针转换为对象指针。例如,在下面的语句中,函数 malloc()返回一个 void 指针,它的值是已分配内存的语句块的地址。这样的赋值操作会把 void 指针转换成 int 指针:
int *iPtr = malloc( 1000 * sizeof(int) );
-
关于全局变量的初始化问题与野指针
2021-05-20 15:53:57今天遇到一个小问题,定义一个全局的指针变量p1,并通过malloc动态分配内存的方法,将一块内存的首地址赋给p1。代码如下:char *p1=malloc(1000);但是使用 gcc 命令编译后报出如下错误(使用C99标准) 看了别人的博客后...今天遇到一个小问题,定义一个全局的指针变量p1,并通过malloc动态分配内存的方法,将一块内存的首地址赋给p1。
代码如下:
char *p1=malloc(1000);
但是使用 gcc 命令编译后报出如下错误(使用C99标准)
看了别人的博客后才知道是如下原因:
c99标准中规定:全局变量和static变量的初始化需要指定一个常量,不能是一个非常量的表达式;而在c++中是可以的。
而且在操作c和c++全局变量时,只能对其采用初始化的方式,而不能采用赋值的方式,即可以
int a = 10;
而不可以:
int a;
a = 10;
解决方法如下:
1.先声明一个空指针
char *p1=NULL;
2.然后在函数中对其赋值
p1=(char*)malloc(1000);
说明:第一步中,必须要将p1初始化,这样是为了避免野指针。
下面再顺便总结一下野指针:
1.什么是野指针?
指向不确定地址的指针变量
2.产生野指针的原因?
2.1 定义的指针变量没有初始化
int *p; //错误
int *p=NULL; //正确
2.2 使用malloc给一个指针变量申请内存,释放后没有将指针变量置为NULL
1)申请一块内存
int *p=(int*)malloc(1000*sizeof(int));2)释放内存
free(p);第二部执行后,p变为野指针,free只是释放了申请的内存,但是这个指针变量依然存在。
3) 将p置为空指针
p=NULL;经过第3步后,p就指向了NULL,避免空指针的产生,否者,在不知道p的状态的情况下,如果访问了p,可能会访问非法的内存,产生段错误。
-
指针变量定义和初始化
2019-04-17 08:16:471.指针定义和初始化 2.指向数组的指针 指针数组 指针定义 ...指针变量的初始化 语法形式 存储类型 数据类型*指针名=初始地址; 例: int *pa = &a; 注意事项 用变量地... -
关于C语言未初始化的指针和空指针
2020-04-16 12:43:43指针p定义的同时初始化,这样可以正常运行,代码如下: #include <stdio.h> int main() { int a; int *p=&...指针初始化为空,此时不能正常运行,代码如下: #include <stdio.h> ... -
C++指针变量,初始化指针是否需要分配内存空间
2021-07-11 19:48:37指针 本质 地址 指向变量的指针,是变量中数据内存的地址, 指向函数的指针是代码内存的地址, 指向数据的指针指向数组开始位置的地址...(1)当我们int *p定义一个指针变量p时,如果p是局部变量,所以也道循C语言局部变 -
空指针和未初始化的指针的区别
2020-02-23 13:47:281.为什么指针变量定义时一定要初始化? 因为你首先要理解一点:内存空间不是你分配了才可以使用只是你分配了之后使用才安全。 为什么要进行对指针初始化呢? 因为指针未被初始化,所以指针所指向的也是随机的,他是个... -
JAVA静态代码块初始化静态变量后,使用静态变量报空指针异常。
2018-11-09 06:32:55先是定义私有静态变量,然后静态代码块初始化。  标红这行报错,空指针异常。 个人疑问,是否是因为B/S结构... -
C语言_指针变量的赋值与运算,很详细详解
2021-05-19 08:05:52指针变量的赋值指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值。未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,... -
go使用全局变量空指针
2020-08-05 20:37:46https://studygolang.com/articles/2587 参考该片文章,楼主一本正经的胡说八道,正解看评论。 全局变量初始化是在main启动之前,如果给全局变量赋初值时,赋值语句还没有初始化,全局变量即为nil ... -
C语言中的“char指针初始化”是什么意思?
2021-05-21 17:26:15其初始化本质上与其它变量初始化没有什么区别,就是赋予其一个初始化的值。对于指针来说,在C语言中,就是一个地址。区分初始化情况,有四种表象:1 初始化为空。即char * str = NULL;的形式,NULL在C语言中是特定... -
不建议用memset初始化指针
2021-07-27 14:33:12先运行一段代码: int main(){ char* f;//不进行赋值,此时无法访问F指针,错误写法,实际不建议这样写code memset(f, 0, sizeof(f)...一般情况下,给空指针赋值为NULL,初始化一块内存,用memset为0。 如果内... -
C语言一些总结(1)—二维指针数组初始化
2021-05-21 08:28:23二维指针数组初始化行数为:row列数为:column方式一:int **dp1;dp1 = (int **)malloc(sizeof(int *) * row);//分配指针数组,计算行的大小for(int i=0; i方式二:int*ptr[row];for(int i=0;i方式三:int (*ptr)... -
为什么c程序传入一个未初始化的指针给函数会导致程序崩溃,而传未初始化指针的地址给函数却不会呢?
2017-11-08 07:39:36比如: typedef char* Elem_ptr 1、导致崩溃的情况 void Function(Elem_ptr c,int n){_ c = (Elem_ptr)malloc(n*sizeof(char)); } //主函数 Elem_ptr s;int i;Function(s,i);...void Function(Elem_ptr *c,int n){ ... -
指针的初始化和赋值(简单说明)
2021-06-18 15:23:21突然关于指针有个地方搞不明白,比如int *p=&a;我们不是说"*"是取值的吗,那么后面不应该跟的是一个数值,怎么是一个地址? -
指针的初始化和赋值
2018-01-05 17:00:581、指针的初始化 指针初始化时,“=”的右操作数必须...此时,*p只是表示定义的是个指针变量,并没有间接取值的意思。 例如: int a = 25; int *ptr = &a; int b[10]; int *point = b; int *p = &b[0]; 如 -
指针的使用之一:初始化
2020-02-23 17:03:21在使用指针时如果出现了错误,第一步我们首先检查指针是否正确的进行了初始化。指针总是指向一个地址的,因此在检查初始化是否正确的时候, ...**一是给指针变量初始化一个在内存中已经存在的地址,**常用的有... -
结构体的指针成员初始化问题
2020-02-03 11:09:45memset(cache, 0, sizeof(*cache)); 所有成员变量的值都是0 , char [10] 型 "\...声明为全局量,会自动初始化为上述值。 typedef struct cacheEntryS { int key; /* 数据的key */ int value; /* 数据的data */... -
C++类指针初始化
2017-12-29 14:22:17初始化为NULL的类指针可以安全的调用不涉及类成员变量的类成员函数而不出错,但是如果类成员函数中调用了类成员变量则会出错,既然赋值为NULL的情况都可以使用,那么自然不初始化的类指针同样满足这类情况。... -
C 指针的知识点(初始化,赋值,函数指针,指针++)
2019-01-03 15:34:18第一种方法就是在定义指针的同时告诉指针指向的地址,第二中情况,不在定义指针的时候初始化,而是把地址直接赋值给指针变量。注意:不可以在指针不清楚指向地址的情况下给指针赋值(但是char p=0或者p=NULL除外,该... -
C语言_指针变量的赋值与运算,很详细
2021-05-20 04:38:20指针变量的赋值指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值。未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,... -
C语言各种变量的初始化
2018-10-07 23:19:00数值类变量初始化 整型、浮点型的变量可以在定义的同时进行初始化,一般都初始化为0。 int inum = 0; float fnum = 0.00f; double dnum = 0.00; 字符型变量初始化 字符型变量也可在定义的同时进行初始化... -
指针初始化为NULL的作用
2018-09-10 15:04:25关于空指针NULL、野指针、通用指针,首先说一下什么是指针,只要明白了指针的含义,你就明白null的含义了。 假设 有语句 int a=10; 那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的... -
C语言基础---指针数组----初始化方式&常量指针数组、指针常量数组
2021-03-22 20:48:24文章目录1. 1. #include <stdio.h> int main() { char* str[3] = { "stra","strb","strc" };...char指针数组可以指向多个字符,直到遇到空为止。p本来指向第一个字符,但是因为是指针,所以要遇 -
指针变量初始化
2017-11-18 11:09:11//若指针变量初始化空,在使用指针时,必须判断是是否为空,两个步骤必须同时存在 if(p!=NULL) *p = 20; system("pause"); return 0; } int main() { int num = 0; int *p = (int*)# *p = 20; ... -
C++中的指针初始化
2019-08-04 21:22:56需要对指针本身和指针的指向都进行初始化,既要初始化内存地址,也要定义内存中的内容。如果不进行指针的初始化,则内存地址随机分配。格根据编译器的不同,会出现警告或者报错不同等级的问题,在编译中也可能出现... -
C++ 不要忘记指针变量的初始化
2016-01-09 09:14:20可以说指针是C/C++语言编程中最给力的工具。指针,让我们直接去面对最为神秘的内存空间,赋予我们对内存进行直接操作的能力。由于指针操作执行速度快、占用内存少,众多...其中,指针的初始化就是我们应当重视的问