一、指针
在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列的值