课堂笔记4

一、指针

在32位系统中,不管什么类型的指针都占4个字节,例如int *、char *、double *、long *……

*在定义时表示是指针变量,在使用时表示取值

int *p,a;

p = &a;

*p = 3;

或者

int a = 1;

int *p = &a;

*p = 3;

以上两种写法都对,这样a和*p的值都为3了

段错误:segmentation fault是访问了不能访问的内存产生的错误

野指针和空指针区别:野指针是指向了不能使用的内存;空指针是指针变量给NULL值后,则是可以使用的,只是不指向具体的变量

int *p和char *p的区别:p代表的内存只能保存int/char型数据

例:数值交换

int a, *pa ; pa = &a ;  //把a的地址给pa,都是整型
把一个指针变量的值赋予相同类型的另一个指针变量;
int a, *pa = &a, *pb ;  pb = pa;  // 把a的地址给pb;(合法)

指针运算:

int x=3, y=0 , *px = &x;     
y = *px +5;       (y = 8)              
y = ++*px ;       (y = 4)                                       
y = *px++ ;       (y = 3)先取px的值后向右移动一个地址

(*p1)++, *p1++区别?
(*p1)++是先取px的值输出,后px的内容加1;
*p1++是先求*p1的值(x),然后再p1++,指向下一个元素,不再指向x;

例:利用指针运算实现库函数strcpy

注意点:用man 3 strcpy查找strcpy函数,得知该函数的返回值类型为char *

在char *mainstrcpy(char *str, char *ptr)中,利用while((*p++ = *q++)!=‘\0');先赋值后判断可以将q中最后的'\0'也拷贝到p,完成拷贝后*p指向最后一个字符,因此如果要返回p,需要在while前再定义一个*tmp,使tmp = p,return tmp

malloc函数:char *src;src = malloc(20);

改进:src = (char *)malloc(sizeof(char)*20);malloc函数返回值是void *所以需要强制类型转换

malloc在堆内存上,不会自动释放,所以需要手动释放,释放后为了不让指针变成野指针

free(src);src = NULL;

例:实现字符串倒叙输出

不同类型与零值比较:

①int:if(n == 0)或者 if (n != 0)
②float:const float EPSINON = 0.00001;
if ((n >= -EPSINON ) && (n <= EPSINON ))
③bool类型:if (flag)或者if (!flag)

④指针类型:if (n == NULL)或者if (n != NULL)

数组元素和指针:
数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
例如: 
int a[10]; /*定义a为包含10个整型数据的数组*/ 
int *p;     /*定义p为指向整型变量的指针*/ 
p=&a[0]; 把a[0]元素的地址赋给指针变量p,也就是说,p指向a数组的第0号元素

P的初值为&a[0] :
p+i和a+i都是a[i]的地址;*(p+i)和*(a+i)都是p+i和a+i所指向的数组元素,即a[i] 
例如:*(p+5),   *(a+5)就是a[5]

思考:
int a[5] = {1, 2, 3, 4, 5};
int *p1 = (int*)(&a + 1);//&a表示数组地址,&a+1跳出数组

int *p2 = (int*)((int)a + 1);//a表示数组首元素地址,转为int型变为四个字节,+1变成第二个字节代表的地址

int *p3 = (int*)(a + 1);//p3[0]为2

p1[0], p2[0], p3[0]的值分别为多少?

指针和字符串:

在C语言中,可以用两种方法访问一个字符串。 
1)用字符数组存放一个字符串,然后输出该字符串。 
int main()

    char string[]=”I love China!”; 
    printf("%s\n",string); 
    return 0;

2) 用字符串指针指向一个字符串。 
main()

char *string[]={”I love China!”,”I am ”}; 
printf("%s\n", *string); 

例:利用指针数组实现字符串排序

从键盘获取字符串写入前,要为每个元素申请空间

函数指针:例 int (*p)()

typedef:定义新的数据类型

typedef int (*FUNC)(int, int);

FUNC p;

以上两句表示int (*p)(int, int);

指针函数:int *p();

例:int *(*(*pf)(int))[10];意义:fp是一个指针,指向一个函数,函数有一个int型的形参,函数的返回值是一个指针,指向一个有10个元素的数组,数组每个元素的类型都是int *

利用函数指针进行冒泡排序

二维指针数组:

&a:指向二维数组的指针

a:第0行首地址

a+1、&a[1]:第1行首地址

a[0]、*(a+0)、*a:第0行第0列地址

a[1]、*(a+1):第1行第0列地址

a[1]+2、*(a+1)+2、&a[1][2]:第1行第2列地址

*(a[1]+2)、*(*(a+1)+2)、a[1][2]:第1行第2列的值


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值