一、指针
1.未赋值之前的指针不可使用(获得地址),如下
错误:
int *p;
int j=12;
*p=j;//错误,p地址确定,可能指向未知区域
正确:
int *p=&i;
int j=12;
*p=j;
2.const 与 指针
1.const指针
int i=0;
int j=0;
int *const q=&i;//q是常量,不可改变(只是地址罢了)
*q=26;//改变值可以
q=&j;//error
2.所指的是const
const int *p=&i;//*p是常量,不可改变,等价于int const* p;(const指针只有这两种方式,判断方式看
const是否在*前后面)
*p=12;//error,*不可改变值
i=13;//这个可以改变(虽然使得*p改变)
p=&j;
总结:
1.const在*前,*p=**不可用
2.const在*后,p=**不可用
3、const的作用
4.指针运算
1.增加
#include<stdio.h>
#include<stdlib.h>
int main(){
int a=1;
int b=0;
int *p=&a;
printf("p=%p\n",p);
p++;
printf("p+1=%p\n",p);//地址增加sizeof(类型),这里增加4,因为sizeof(int)=4
exit(0);
}
2.相减
#include<stdio.h>
#include<stdlib.h>
int main(){
int a[]={0,1,2,3,4,5,6};
int *p1=&a[1];
int *p2=&a[5];
//printf("*p=%d\n",*p);
//printf("*(p+1)=%d\n",*(p+1));
printf("p1-p2=%d",p1-p2);//-4
printf("p2-p1=%d",p2-p1);//4,相当于 地址相减/sizeof(指针类型) ,也可以看成间距
exit(0);
}
3.指针类型转换
void *p=&i;
void *q=(void *)p;
5.分配内存malloc
int *p=(int *)malloc(n*sizeof(int));
***
free(p);//必须配套使用
6.函数指针
作用1:设置值
#include<stdio.h>
#include<stdlib.h>
typedef struct{//可变长数组,链表
int size;
int *array;
}IntArray;
/**
*创建可变长数组
*/
IntArray creat_IntArray(int size){
IntArray a;
a.size=size;
a.array=(int*)malloc(size*sizeof(int));
return a;
}
/**
*设置数组值
*返回位置上的值
*/
int* IntArray_at(IntArray* a,int index){
return &(a->array[index]);
}
/**
*释放内存
*/
void IntArray_free(IntArray *a){
free(a->array);
a->array=NULL;
a->size=0;
}
int main(int argc,char const *argv[]){
IntArray a=creat_IntArray(10);
*IntArray_at(&a,0)=10;//设置0位置上的值为10
printf("a[0]=%d\n",*IntArray_at(&a,0));//输出0位置上的值,结果为10
printf("size=%d\n",a.size);//数组长度
IntArray_free(&a);//释放内存
printf("a.size=%d\n",a.size);
}
7.函数指针
1.当变量
#include<stdio.h>
void f0(int i) {
printf("f0,%d\n", i);
}
void f1(int i) {
printf("f1,%d\n", i);
}
void f2(int i) {
printf("f2,%d\n", i);
}
void f3(int i) {
printf("f3,%d\n", i);
}
void f4(int i) {
printf("f4,%d\n", i);
}
int main() {
void (*p[])(int) = { f0,f1,f2,f3,f4 };//将函数存放到指针中
printf("length=%d\n", sizeof(p) / sizeof(p[0]));
int i = 0,j=0;
printf("请选择需要调用的函数和参数:");
scanf_s("%d%d", &i,&j);
(*p[i])(j);
return 0;
}
/*
input:
0 1 相当于*p[i]=fi; (*p[i])()=fi();
1 1
output:
f0,1
f1,1
*/
2.当参数,用于传递函数
#include<stdio.h>
int cal(int (*p)(int,int),int a,int b) {
//printf("cal=%d\n",(*p)(a,b));
(*p)(a, b);
}
int plus(int a, int b) {
return a + b;
}
int minus(int a,int b) {
return a - b;
}
int main() {
printf("cal(plus,1,2)=%d\n",cal(plus,1,2));
printf("cal(minus,1,2)=%d\n", cal(minus, 1, 2));
return 0;
}
/*
output:
cal(plus,1,2)=3
cal(minus,1,2)=-1
*/
二、数组
1. 二维字符串数组
1). char a[][10]={"hello","world"};//字符串长度不能超过10
2).char *a[]={"hello","world","world123456789"};//上面的改进版,长度任意。
12