指针变量.定义方式:\方式:基类型 *指针变量,指针变量是基本数据类型派生出来的类型,其不能离开基本类型而独立存在。

一、指针变量\n1.定义方式:\n方式:基类型 *指针变量,指针变量是基本数据类型派生出来的类型,其不能离开基本类型而独立存在。\n\n指针类型表示:指向整型数据的指针类型表示为int*,读作指向int的指针 or int指针\n在定义指针变量时必须指定基类型,不同类型的数据在内存中所占的字节数和存放方式是不同的。只有知道该数据类型,才能按存储单元长度和数据的存储形式正确的取出该数据。\n2.引用方式:\n&取地址符,*间接访问运算符\n\n给指针变量赋值:p = &a;\n引用指针变量指向的变量:printf(\"%d\", *p);\n引用指针变量的值:printf(\"%o\", p);\n注:C语言中实参变量和形参变量之间的数据传递是单向的值传递方式,用指针变量作函数参数同样要遵循这一规则。\n\n不可改变实参指针变量值\n但可改变实参指针变量所指向变量的值\n二、指针引用数组\n1.数组元素指针运算\n所谓数组元素指针就是数组元素地址,\n\n引用数组元素可以用下标法,也可以用指针法(通过指向数组元素的指针找到所需的元素,占用内存少、运行速度快)。\n\n当指针指向数组元素时,允许对指针(地址)进行加减运算。\n\n如果指针变量指向数组中一个元素,则p+1指向该元素的下一个元素,p-1指向该元素的上一个元素。\n如果指针变量p1和p2都指向同一个数组,执行p1-p2的结果是(p1-p2)/sizeof(arrElem),即所指元素之间相差元素的个数。\n两个地址不能相加,其结果是无实际意义的。\n2.指针引用数组元素\n引用数组元素的方法有下标法arr[i]与指针法*(arr + i):\n\n#include\u003Cstdio.h>\n.\nint main() {\n    int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n    for (int i = 0; i \u003C 10; ++i) printf(\"%d \", a[i]);//(1)下标法引用数组元素\n    printf(\"\\n\");\n    for (int i = 0; i \u003C 10; ++i) printf(\"%d \", *(a + i));//(2)数组名计算元素地址 间接访问该元素\n    printf(\"\\n\");\n    for (int *p = a; p \u003C (a + 10); ++p) printf(\"%d \", *p);//(3)指针变量引用数组元素\n    printf(\"\\n\");\n    return 0;\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n\n\n方法(1)和方法(2)的执行效率相同,编译器将a[i]转换为*(a+i)再进行处理/计算元素地址,这两种方式寻找数组元素费时较多。\n方法(3)速度较快,用指针变量直接指向元素/不必每次都重新计算元素地址,这种有规律的改变地址值能有效提高执行效率。\n对于方法(3)的执行指针不能直接用数组名arr替代(需要额外定义指针类型),因为数组名是一个指针型常量,其值固定不变。\n注:利用指针引用数组元素,比较灵活有不少技巧。\n\n*p++:由于++与*运算符同优先级,结合方向为自右向左,因此其等价于*(p++)\n*(p++)与*(++p):作用不同,前者是先取*p然后+1,而后者是先+1然后取*p\n3.数组名作函数参数\n用数组名作为函数实参时,\n\n函数对应的形参可以是指针变量int *arr,也可以是形参数组int arr[],这是因为C语言中下标法和指针法都可以访问到一个数组。\n\n即如果有一个数组arr,则arr[i]与*(arr + i)无条件等价。\n\n注:如果用指针变量int *arr作为实参,必须先使指针变量有确定值指向一个已定义的对象,否则报错。\n\n三、指针引用字符串\n通过指针引用字符串,可以使字符串的使用更加灵活方便。\n\n1.字符串引用方式\n方式1:字符数组arr[i]、printf(\"%s\", arr)\n\n方式2:字符指针char *string = \"I love china!\"、printf(\"%s\", string)\n\n对字符指针string初始化,实际上是把字符串的第1个元素的地址赋值给string指针,使string指向字符串第一个字符。\n\n%s是输出字符串时所用的格式符,系统会输出string指向的第一个字符,然后自动使string+1输出下一个字符直到遇到字符串结束标志\\0为止。\n\n在内存中字符串的最后被自动加上\\0,\n\n对于数值型数组的元素值只能逐个输出\n\n程序阅读:字符串拷贝函数的进化过程\n\nvoid copy_string(char *src, char *dest) {\n    while((*dest = *src) != '\\0') {\n        dest++;\n        src++;\n    }\n}\n1\n2\n3\n4\n5\n6\nvoid copy_string(char *src, char *dest) {\n    while((*dest++ = *src++) != '\\0');\n}\n1\n2\n3\nvoid copy_string(char *src, char *dest) {\n    while((*dest++ = *src++));\n}\n1\n2\n3\n2.字符指针和字符数组比较\n用字符数组char arr[];与字符指针char *arr;都能实现字符串的存储与运输,但是其二者之间是有区别的:\n\n字符指针变量中存放的是地址,而字符数组是由若干个元素组成,每个元素中存储一个字符。\n\n编译时对字符指针变量只分配一个存储单元,而为字符数组分配若干存储单元,以存放各元素的值。\n\n可以对字符指针赋值,但不能对字符数组名赋值(常量const char *)。\n\n字符数组中各个元素的值是可以进行修改的,但字符指针指向的字符串不能被赋值(除非直接更换指针指向)\n\nchar a[] = \"House\";\nchar *b = \"House\";\na[2] = 'r';//合法\nb[2] = 'r';//非法\n1\n2\n3\n4\n若字符指针指向字符,则其对字符数组元素的引用也可以使用下标法和地址法,否则其引用是没有意义的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值