首页 > 其他分享 >C语言初级阶段7——指针1

C语言初级阶段7——指针1

时间:2022-11-07 15:13:01浏览次数:49  
标签:10 arr 初级阶段 变量 int C语言 printf 指针

C语言初级阶段7——指针1

地址与指针

1.地址:数据在内存中的存储位置编号,是一个常量。

2.指针:指针的本质就是地址。

指针变量的定义和声明

1.指针变量:存储的数据是地址。

2.定义方法:类型*标识符

3.得到变量的地址:&

4.指针变量取了谁的地址,就指向谁。

5.*的作用:指针变量的标志

6.*:取内容,解引用

7.指针变量所占内存:一律占四个字节内存

8.注意:定义指针的时候,要马上给指针变量赋值,防止出现野指针(没有任何指向)。

9.NULL:空

10.数组名本身就表示是这个数组的首地址。

11.p += 8;指针的偏移。

12.指针也是有类型的,指针的类型就是定义的时候 类型*变量

13.产生野指针的几种情况

(1)定义一个指针变量时没有初始化
如:int *p;
都知道我们在定义一个非指针的变量时如果没有初始化,则这个变量的值是随机的(如:int a;)
指针变量同样如此,指针变量的随机值的意思就是说他指向的位置是随机的

(2)动态开辟的内存空间在使用完后调用free函数释放掉这段内存空间,却没有将对应的指针职位NULL。虽然开辟的空间被释放掉但指针依旧存在。

如:int func()
{
int *p = malloc(sizeof(int));
free(p);//没有将p值为NULL的操作
}

(3)对指针的操作已经超出了指针变量的作用域
比如通常我们实现了一个函数,该函数里创建了一个指针变量,而函数结束时最终返回这个指针变量,但是函数调用结束后,该函数的函数栈帧就会被销毁,所以返回的这个指针变量所指向的空间已经被释放了,因此这个指针变量指向的空间就变成了随机的。

14.野指针的危害

(1)指向不可访问的地址
危害:触发段错误。
(2)指向一个可用的,但是没有明确意义的空间
危害:程序可以正确运行,但通常这种情况下,我们就会认为我们的程序是正确的没有问题的,然而事实上就是有问题存在,所以这样就掩盖了我们程序上的错误。
(3)指向一个可用的,而且正在被使用的空间
危害:如果我们对这样一个指针进行解引用,对其所指向的空间内容进行了修改,但是实际上这块空间正在被使用,那么这个时候变量的内容突然被改变,当然就会对程序的运行产生影响,因为我们所使用的变量已经不是我们所想要使用的那个值了。通常这样的程序都会崩溃,或者数据被损坏。

15.避免方法

(1)定义一个指针变量时一定记得初始化
(2)动态开辟的内存空间使用完free之后一定将对应的指针置为NULL
(3)不要在函数中返回栈空间的指针和引用
(4)注意在使用时对指针的合法性的判断

#include<stdio.h>
int main() {
    int a = 10;
	float b = 1.1f;
	int* p = &a;
	return 0;
}
#include<stdio.h>
int main() {
	int a=10, b=20, c=30;
	int* p1, * p2, * p3;
	p1 = &a;
	p2 = &b;
	p3 = &c;
	printf("%d\n", *p1);
	int*a1=NULL;
	float*a2=NULL;
	double*a3=NULL;
	char* a4;
	printf("%d\n%d\n%d\n%d\n", sizeof(a1), sizeof(a2), sizeof(a3),sizeof(a4));
	printf("%d\n%d\n%d\n%d\n",sizeof(*a1), sizeof(*a2), sizeof(*a3), sizeof(*a4));
	return 0;
}
#include<stdio.h>
void fun(int* x, int* y) 
{
	*x = 3;
	*y = 0;
}
int main() {
	int a = 10, b = 20;
	fun(&a, &b);
	printf("%d\n%d\n", a, b);
	return 0;
}
#include<stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < 10; i++)
	{
		printf("%p\n", &arr[i]);
	}
	int *p = arr;
	printf("%d\n", *p);
	p += 8;//等价于p = &arr[9]
	printf("%d\n", *p);
	return 0;
}
#include<stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < 10; i++)
	{
		printf("%p\n", &arr[i]);
	}
	int *p = arr+4;//指针的偏移
	printf("%d\n", *p);
	return 0;
}
#include<stdio.h>
#include<string.h>
int main() {
	//常量字符串
	const char * p1 = "Hello World";//正常可以去掉const但是VS2022需要加不然报错
	printf("%d\n", sizeof(p1));
	printf("%d\n", strlen(p1));
	p1 += 4;
	printf("%c\n" , *p1);
	return 0;
}
#include<stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	double* p2 = (double*)&arr[0];
	p2++;
	printf("%d\n", *((int*)p2));
	char* p4 = (char*)&arr[0];
	p4 += 4;
	printf("%d\n", *((int*)p4));
	printf("%d\n", *((int*)p2));
	return 0;
}

标签:10,arr,初级阶段,变量,int,C语言,printf,指针
From: https://www.cnblogs.com/George-Judson/p/16866018.html

相关文章

  • C语言初级阶段7——指针2——特殊指针
    C语言初级阶段7——指针2——特殊指针指针函数:是一个函数,返回值类型是一个指针。#include<stdio.h>int*fun(){ //a是一个局部变量 inta=10; return&a;}intm......
  • C语言初级阶段7——指针3
    C语言初级阶段7——指针3指针数组:描述的是一个数组,存储的是指针#include<stdio.h>voidfun(int(*arr)[2]){ for(inti=0;i<2;i++) { for(intj=0;j<2......
  • 实验4 类与数组、指针
    task5.cpp#include<iostream>#include"vectorInt.hpp"voidtest(){usingnamespacestd;intn;cin>>n;vectorIntx1(n);for(autoi......
  • 计算机等级考试二级C语言上机题集(第76~80套)
    第76套1.程序填空题给定程序中,函数fun的功能是:找出100~999之间(含100和999)所有整数中各位上数字之和为x(x为一正整数)的整数,然后输出;符合条件的整数个数作为函数值返回。例......
  • 计算机等级考试二级C语言上机题集(第71~75套)
    第71套1.程序填空题给定程序中,函数fun的功能是:将参数给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中读入,并调用库函数atoi和atof将字符串转换成相......
  • 计算机等级考试二级C语言上机题集(第66~70套)
    第66套1.程序填空题给定程序中,函数fun的功能是:在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符。若找不到相同的字符则函数不做任何处理。例如......
  • 计算机等级考试二级C语言上机题集(第61~65套)
    第61套1.程序填空题给定程序中,函数fun的功能是:找出100~x(x<=999)之间所有整数中各位上数字之和为15的整数,然后输出;符合条件的整数个数作为函数值返回。例如,若x=500时,100~50......
  • 计算机等级考试二级C语言上机题集(第56~60套)
    第56套1.程序填空题给定程序中,函数fun的功能是:在带头结点的单向链表中,查找数据域中值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在值为ch的结点,......
  • 计算机等级考试二级C语言上机题集(第51~55套)
    第51套1.程序填空题给定程序中,函数fun的功能是将不带头结点的单向链表逆置。即若原链表从头至尾结点数据域依次为:2、4、6、8、10,逆置后,从头至尾结点数据域依次为:10、8、6......
  • 初学C语言(3)
    由于疫情原因在学校无法更新。常量:1.字面常量:直接输入即可。如图:2.const修饰的常量:intmain(){constintnum=3;//语法形式为const+数据类型+变量名+=+变......