个人主页:
专题分栏---C语言疑难:
今天,既是为了我自己来巩固进阶指针的知识,也是为了兄弟们能明白这块知识点。
目录
一、指针前瞻
1.指针是个变量,用来存放地址的。接下来用图进行形象的描述:
a里面存的是整型10,b里卖弄存的是a的地址。a叫做整型变量,而b叫做指针。
指针和地址其实是划等号的。
2.指针的大小为4/8个字节(32位平台/64位平台)。
3.指针是有类型的,指针的类型决定了指针+整数的步长和指针解引用时候的操作权限。
a1原来的地址是61fc30,a1+1之后的地址是61fc34,指针加1之后的地址加了4个字节,相当于加了一个整型所占的字节。剩下两个也同理加了一个数据类型的字节。
4.指针运算
#include<stdio.h> int main() { int a[10] = {10}; int* b = a; int* c = a + 5; printf("%d", c-b); return 0; }
两个指针相减本质上是两个指针所指数组之间相差的元素个数
二、指针进阶
1、字符指针
const 修饰的变量里面的内容不能改,常量字符串也不能改,所以a,b指向的是同一个空间。
2、数组指针
数组指针的本质是指向数组的指针。
3、指针数组
指针数组的本质是存放指针的数组。
4、函数指针
所谓函数指针即定义一个指向函数的指针变量。
#include<stdio.h> int Add(int x, int y) { return x+y; } int main() { int(*p)(int,int)=NULL; p=Add; return 0; }
然后可以对p进行解引用操作来调用函数。
5、习题解析
#include<stdio.h> #include<string.h> int main() { const char* a="abcdefg"; const char b[] = { 'a','b','c','d','e','f','g' }; printf("%d\n", strlen(a)); printf("%d\n", sizeof(a)); printf("%d\n", strlen(b)); printf("%d\n", sizeof(b)); return 0; }
首先,strlen是用来计算字符串长度的,遇到'\0'结束(不包括‘\0’);而sizeof是一个运算符,sizeof算的是空间大小,单位是字节。
对于常量字符串“abcdefg”,他其实是相当于{'a','b','c','d','e','f','g',‘0’}。
strlen(a)其实就是等于7;
sizeof(a)其实算的是a变量所占的空间的大小,因为a是指针类型所以占4/8字节;
strlen(b)因为b数组里面存的没有‘\0’,所以会接着往下运行,直到遇见‘\0’。所以是随机值
sizeof(b)算的就是整个数组的空间大小,一共有7个元素,每个元素的类型是char类型, 所以最终的算的是7*1个字节。