c语言-零基础学习第十二讲-指针(2)

1.指针变量的大小:

int main()
{
	int num = 10;
	int* p = #
	char ch = 'w';
	char* pc = &ch;
	printf("%d\n", sizeof(p));
	printf("%d\n", sizeof(pc));
	return 0;
}

在x86环境下,结果为4,4
因为在32位机器上,指针地址转换为数字信号,得到32个0/1组成的二进制序列,即为4个字节。

同理,在x64环境下,结果为8,8。

2.指针类型的意义:

2.1.指针的解引⽤

指针类型决定了指针在解引用时一次能操作几个字节,如:

2.2. 指针+-整数

int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}

结果 char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。

例:用指针的方式访问整个数组:

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int* p = &arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}

3.const修饰指针:

3.1.const修饰变量

const可使变量无法修改,如n=20会报错;但可通过指针变量“越狱”:

int main()
{
const int n = 0;
printf("n = %d\n", n);
int*p = &n;
*p = 20;
printf("n = %d\n", n);
return 0;
}

3.2.const修饰指针变量

• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。

eg: const*p---p=&m可行,*p=100不行

• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。

eg: *const p---*p=100可行,p=&m不行

注:const放到 int 前后无影响  eg: int const *p==const int *p

4.指针运算:

4.1. 指针+-整数

p+1跳动字节数由指针类型决定,如int类型跳动4个字节。

4.2.指针-指针

就是地址-地址,结果为两指针间元素个数。

注:两指针必须指向同一块空间。

练习:求字符串长度

方法一:

my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

方法二:

my_strlen(char* str)
{
	char* start = str;
	while (*str != '\0')
		str++;
	return str-start;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

注:数组名就是数组首元素地址。

5.野指针:

概念:野指针就是指针指向的位置是不可知的。

5.1.野指针形成原因:

1.指针未初始化;int *p;

2.指针越界访问:

int main()
{
	int i = 0;
	int arr[10] = { 0 };
	int* p = &arr[0];
	for (i = 0; i < 11; i++)
	{
		*p = i;
		p++;
	}
	return 0;
}

疑问:这种野指针指向位置是arr后面的地址还是不可知的?

实测,指向arr后面地址。

3.指针指向的空间释放:

int* test()
{
int n = 100;
return &n;
}
int main()
{
int*p = test();
printf("%d\n", *p);
return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值