指针知识点记录

今天来记录下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
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

你可能感兴趣的:(C,C)