大家好,欢迎来到IT知识分享网。
目录
7. 数组名作为函数的参数(数组名是个指针常量,本质上也等同于指针作为函数参数)
1. 直接访问和间接访问
直接通过变量名访问(直接访问)不挺好吗,为什么还要间接访问(指针)呢,是不是多此一举?
解释:通过指针,程序能访问的内存区域就不仅限于变量所占据的数据区域。
那问题来了,我只访问我定义的变量,没有定义的变量我也不访问啊,那定义指针不是吃饱了没事干吗?
解释:有的程序需要用到指针,而且C++中很多库函数就是用指针作为参数的,所以你说你学了C++,但是不会指针,不是很荒谬吗。
指针基础
2. 指针变量的定义
在C语言中,把专门用来存放变量地址的变量成为“指针变量”,简称为指针。
指针变量的类型不是指指针变量本身的类型,而是指它所指向的变量的数据类型。无论何种类型的指针变量,它们都是用来存放地址的,因此指针变量自身所占的内存空间大小和它所指向的变量数据类型无关,尽管不同类型的变量所占的内存空间不同,但不同类型指针变量所占的内存空间大小都是相同的。
*号所代表的含义
- 乘法运算法
- 在定义时,指针说明符
- 在定义后,间接访问符
3. 指针的基本运算
包括间接访问,赋值,比较和算术运算,这里不展开了。
4. 指针变量的初始化
指针和函数
5. 指针作为函数的参数(主角是指针,和函数的关系)
例子:交换两个变量的值
#include <stdio.h> void swap(int *px, int *py); int main() { int a=5,b=6; int *pa = &a,*pb=&b; printf("a=%d,b=%d\n",a,b); swap(pa,pb); //swap(&a,&b); printf("a=%d,b=%d\n",a,b); return 0; } void swap(int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp; }
函数的参数包括实参和形参,两者的类型要一致。如果将某个变量的地址作为函数的实参,相应的形参就是指针。
想要通过函数调用来改变主调函数中某个变量的值:在主调函数中,将该变量的地址或者指向该变量的指针作为实参;在被调函数中,用指针类型形参接收该变量的地址,并改变形参所指向变量的值。
指针和数组
6. 指针、数组和地址的关系
//数组求和的几种方式 //方法一 sum = 0; for(p=a; p < &a[99]; p++) sum += *p; //方法二 sum = 0; for(i = 0;i < 100; i++) sum += *(a+i); //方法三 p = a;//数组名转换成指针形式 sum = 0; for(i = 0;i < 100; i++) sum += p[i]
数组名可以用指针形式,而指针变量也可以转换成数组形式。
/*分别使用数组和指针计算数组元素之和*/ #include <stdio.h> int main() { int i,a[10],*p; long sum = 0; printf("Enter 10 integers:" ); for(i = 0; i < 10; i++){ scanf("%d",&a[i]); } for(i = 0; i < 10; i++){ sum = sum + a[i]; } printf("calculated by array,sum = %ld\n",sum); sum = 0; for(p = a; p <= a+9; p++){/*使用指针求和*/ sum += *p; } printf("calculated by pointer,sum=%ld\n",sum); return 0; }
7. 数组名作为函数的参数(数组名是个指针常量,本质上也等同于指针作为函数参数)
/*使用冒泡排序对输入的n个正整数进行从小到大排序*/ #include <stdio.h> void bubble(int a[], int n); int main() { int n,a[8]; int i; printf("Enter n(n<=8):"); scanf("%d",&n); printf("Enter a[%d]:",n); for(i = 0; i < n; i++){ scanf("%d",&a[i]); } bubble(a,n); printf("After sorted,a[%d]=",n); for(i = 0; i < n; i++){ printf("%3d",a[i]); } return 0; } void bubble(int a[],int n)//int a[]等价于int *a { int i,j,t; for(i = 1; i < n; i++){ for(j = 0; j < n-i; j++){ if(a[j] > a[j+1]){ t = a[j];a[j] = a[j+1];a[j+1] = t; } } } }
指针和字符串
C语言标准库有很多字符串处理函数。
8. 字符串和字符指针
字符串常量是用双引号括起来的字符序列,通常被看做一个特殊的一维字符数组。字符串常量实质上是一个指向该字符串首字符的指针常量。
字符数组和字符指针都可以用来处理字符串。输出字符串时,输出参数给出起始位置(地址),然后从该地址开始连续输出其中的内容(字符),直到遇到‘\0’为止,‘\0’用来控制结束。
字符数组和字符指针都可以用来处理字符串,但是两者之间有重要区别。字符数组在内存中占用一块连续的单元,有确定的地址,每个数组元素放字符串的一个字符,字符串就放在数组中。字符指针只占用一个可以存放地址的内存单元,存储字符串首字符的地址。
char sa[] = "This is a string"; char *sp = "This is a string";
改变字符串时,字符数组只能改变数组元素的内容,字符指针可以直接改变指针的值,让它指向新的字符串。
strcpy(sa,"Hello");//错误,数组名是指针常量,不能赋值 sp = "Hello"
为了尽量避免引用未赋值的指针所造成的危害,在定义指针时,可先将其初值置为空,如char *s = NULL。
9. 常用的字符串处理函数
字符串输入和输出函数
- sacnf(”%s”,字符型数组名(地址)):遇回车或空格输入结束,并自动将输入的数据和字符串结束符’\0’送入数组。
- printf(”%s”, 字符数组名或字符串常量):输出遇到’\0’结束。
- 字符串输入函数gets(字符数组名):从输入得到一个字符串,遇回车输入结束,自动将输入的数据和’\0’送入数组中。采用gets()输入的字符串允许带空格。
- 字符串输出函数puts(字符数组名或字符串常量):遇到’\0’自动将其转换成’\n’,即输出字符串后换行。
字符串复制函数
char *strcpy(char *s1, char *s2)//把字符串s2复制到s1,直到遇到s2中的'\0'为止。 //s1要足够大,防止字符串越界 //可以简写成 strcpy(s1, s2) //参数s1必须是字符型数组基地址,参数s2可以是字符数组名或字符串常量。
字符串连接函数
strcat(s1, s2)//将s2接到s1的后面,s1中原有的结束符'\0'被放置在连接后的结束位置上。 //s1要足够大,防止字符串越界 //参数s1必须是字符型数组基地址,参数s2可以是字符数组名或字符串常量
字符串比较函数
strcmp(s1, s2) //相等返回0 //s1>s2,返回一个正数 //s1<s2,返回一个负数。
字符串长度
strlen(s1) //返回字符串有效字符的个数,不包括'\0'
总结:
上述为读书笔记,主要内容是了解指针的定义和赋值,指针作为函数的参数可以修改主调函数中变量的值,指针和数组的关系,数组名(地址)作为函数的参数,以及指针和字符串的关系,以上只是指针部分的基础内容。
指针的进阶内容有:指针数组,指针函数,指针的指针。
指针能和变量产生关系,能和数组产生关系,能和函数产生关系,能和字符串产生关系,所以这也间接看出来指针的重要性。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112370.html

