指针知识点记录

本文记录了C语言中指针的相关知识点,包括指针变量大小,32位下为4字节,64位下为8字节。还介绍了指针取值、n级指针、野指针的成因及避免方法,如指针初始化、释放后置空等,同时提到数组名可看成指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天来记录下C中指针的一些知识点,基本忘光了。
C#:为什么,明明是我先
指针变量大小:32位下是4个字节(64位下是8个字节),所有类型指针变量都一样
指针取值&n级指针乱七八糟:*p,说白了其实就是,
&p:指针本身所在内存地址,
p:指针的值,一般给他赋值一个其他变量的内存地址,
*p:取指针的值当作内存地址去寻那个地址下的值。

野指针:主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针。
避免野指针:

  • 指针变量未初始化

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错。

  • 指针释放后之后未置空

有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

  • 指针操作超越变量作用域

不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

空指针:对于空指针值,一般的文档中倾向于用 NULL 表示

void bubble(int arr[], int len)
{
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len-i-1; j++)
		{
			if (arr[j]>arr[j+1])
			{
				arr[j] -=arr[j + 1];
				arr[j + 1] += arr[j];
				arr[j] = arr[j + 1] - arr[j];
			}
		}
	}
}
int main()
{
	int arr[10] = { 5432,6751,5344,782 ,23,4321,532,5321,1234,234};
	int* p = arr;
	bubble(p, sizeof(arr) / sizeof(arr[0]));
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}

数组名其实可以看成是一个指针,将数组传递到函数内部操作会改变数组本身,以上代码运行结果:

23
234
532
782
1234
4321
5321
5344
5432
6751

数组已重新排列,但是!!数组无法直接传递到函数内部,仅仅是作为一个指针传入(字符数组可以利用最后一位是‘\0’的特性将完整字符串传入):

void rec(char *arr)
{
	int len = strlen(arr);//使用strlen可以获取完整的数组,但只有字符数组能这么做
	char* p1 = arr;
	char* p2 = &arr[len-1];
	while (p1<p2)
	{
		char temp = *p1;
		*p1 = *p2;
		*p2 = temp;
		p1++;
		p2--;
	}
}

int main()
{
	char arr[] = "hello world!";//数组名其实就是一个指针
	rec(arr);
	printf("%s\n", arr);
	printf("%x\n", arr);
	printf("%x\n", *arr);
	return 0;
}
void test(int arr[])
{
	printf("%d", arr[2]);//
	arr[2] = 3213;
	for (int i = 0; i < sizeof(arr); i++)//传递进来的是一个指针,并不是一个数组,这里的sizeof大小是4,若是要传递数组,需要再传递一个数组长度
	{
		printf("test下arr大小%d\n", sizeof(arr));
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0,10 };
	test(arr);
	printf("main下面的arr大小%d",sizeof(arr));//这里能把arr看成一个数组,不会看成一个地址
	return 0;
}

上面代码运行结果:

test下arr大小4
test下arr大小4
test下arr大小4
test下arr大小4
main下面的arr大小44
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值