void func1();//指针
void func2_1(int x,int y);//参数值传递
void func2(int *x,int *y);//参数地址传递
void func3(char *c,int *i,double *d);//多种类型值传递
void func4();//数组指针的使用
void func5();//数组指针的使用-例子
void func6();//二维数组指针
void func7();//动态内存分配 翻转
//字符串指针
//例1:字符串复制
void func8();//主执行函数
void Strcpy(char *target,char *source);//复制函数
//例2:字符串翻转
void func9();//主执行函数
int Strlen(char *source); // 计算字符串长度 函数
void Rev(char *source); // 字符串翻转函数
void func10();//指针作为函数返回值
int *getAnArraylnFun();
int main(int argc, const char * argv[]) {
//指针
// func1();
//参数值传递
//参数地址传递
// int x=10,y=20;
// int *px=&x,*py=&y;
// func2_1(x,y);
// printf("执行func2_1后,实参:%d,%d\n",x,y);
// func2(px,py);
// printf("执行func2后:%d,%d\n",*px,*py);
//多种类型值传递
// char cc='a';
// int ii=10;
// double dd=16.5;
// func3(&cc, &ii, &dd);
// printf("%c,%d,%.2f",cc,ii,dd);
//数组指针的使用
// func4();
//例,七星彩票
// func5();
//二维数组指针
func6();
//动态内存分配
// func7();
//字符串指针
// func8();
// func9();
//指针作为函数返回值
// func10();
return 0;
}
//
//指针
//一个内存中的地址称为指针
//指针变量中存储的是指针
//指针变量的*、/、%运算都是没有意义的
// +、-运算有意义,针对数组指针做加减运算
void func1(){
int i=10;
char c='a';
double d=12.5;
int *pi;//指针的声明
pi=&i;//指针赋值,pi存储了i变量的指针
char *pc=&c;//声明字符指针变量,存储字符变量C的地址
double *pd=&d;
printf("pi=%p,pc=%p,pd=%p\n",pi,pc,pd);//%p
printf("*pi=%d,*pc=%c,*pd=%f\n",*pi,*pc,*pd);//使用(*)取值访问其内存地址下内容
*pi=100;
printf("i=%d,*pi=%d\n",i,*pi);
i=20;
printf("i=%d,*pi=%d\n",i,*pi);
printf("%ld,%ld,%ld\n",sizeof(pi),sizeof(pc),sizeof(pd)); //指针变量的存储大小都是8字节
printf("-----------------------------------\n");
//例:
int n1=1,n2=2;
int *p1=&n1,*p2=&n2;
printf("n1=%d,n2=%d,*p1=%d,*p2=%d\n",n1,n2,*p1,*p2);
p1=p2;
printf("n1=%d,n2=%d,*p1=%d,*p2=%d\n",n1,n1,*p1,*p2);
printf("-----------------------------------\n");
//&和*运算符
int t=10;
int *p=&t;
//&*p-取出变量i的地址,*&i-取出变量i内的数据
printf("&*p=%p,*&t=%d\n",&*p,*&t);
printf("-----------------------------------\n");
int a = 10;
int *pa;
pa = &a;
printf("pa=%p\n",pa);
printf("*(pa+1)=%d\n",*(pa+1));//*(pa+1)==&(a+1)上的值
printf("*pa++=%d\n",*pa++);//加括号后,运算优先顺序不变,先取地址,然后执行*pa后,再进行pa+1;
printf("pa=%p\n",pa);
printf("%d\n",*pa);
printf("-----------------------------------\n");
//指针变量的+、-运算(数组)
int arr[5]={1,2,3,4,5};
int *ps=arr;//等价于 int ps=&arr[0];
printf("%d\n",*(ps+2));//*(ps+2)==a[0+2]
ps=&arr[4];//*ps=arr[4];
printf("%d\n",*(ps-1));//*(ps-1)=arr[4-1]
}
//参数值传递
void func2_1(int x,int y){
int temp=x;
x=y;
y=temp;
printf("func2_1内,形参:%d,%d\n",x,y);
}
//参数地址传递
void func2(int *x,int *y){
int temp=*x;
*x=*y;
*y=temp;
}
//如何返回多个不同类型的参数
void func3(char *c,int *i,double *d){
*c='A';
*i=100;
*d=165.5;
}
//数组指针的使用
void func4(){
int arr[5]={10,4,2,14,19};
int *p=arr;//p指向数组
//1、使用下标 arr[i]
for (int i=0; i<4; i++) {
printf("arr[%d]=%d,p[%d]=%d\n",i,arr[i],i,p[i]);
}
//2.使用指针来访问
for (int i=0; i<5; i++) {
printf("*(p+%d)=%d,(arr+%d)=%d\n",i,*(p+i),i,*(arr+i));//*(arr+i)-数组名指针
}
//3.使用指针(建议不要使用)
//数组变量arr是常量 不要去修改数组的地址
for (int i=0; i<5; i++) {
printf("*p++=%d\n" ,*p++);
}
}
//使用上述访问数组元素的三种方式输出某期体育彩票七星彩的几个数字
void func5(){
int arr[7];
int *p=arr;
for (int i=0; i<7; i++) {
printf("请输入第%d个数:\n",i+1);
scanf("%d",(p+i));
}
printf("七星彩票号码为:\n");
for (int i=0; i<7; i++) {
printf("%d\n",*(arr+i));
}
}
//二维数组指针
void func6(){
/*
1 2 3
4 5 6
*/
int arr[2][3]={1,2,3,4,5,6};
//int *p;
//p=arr;代码错误,p是int类型指针,arr是二维数组,不同类型无法赋值
//p=arr[0];//指针p指向一维数组(1,2,3)
//p=&arr[0][0];//指向第一个元素地址
int (*p)[3]=arr;//数组指针——>指向包含三个整形元素的数组
printf("%p\n",arr);//数组名指针。arr=首行首列元素的地址
printf("%p\n",arr[0]);//arr[0]=第一行所代表数组的首元素地址
printf("%p,%p,%p\n",arr+0,arr+1,arr[0]+1);//arr+0==a[0],arr+1==arr[1],arr[0]+1==&arr[0][1]
printf("%p\n",*(arr+1));//*(arr+1)==a[1]
printf("%p\n",*(arr+1)+1);//*(arr+1)+1==&arr[1][1]
printf("%d\n",*(*(arr+1)+1));//(*(arr+1)+1)==arr[1][1]
printf("%d\n",**(p+1));//p+1=第二行所代表数组的首元素地址,*(p+1)=第二行第一列元素的地址
printf("%d\n",*(*(p+1)+1)+10);//*(p+1)+1=第二行第二列元素的地址,*(*(p+1)+1)+10=第二行第二列元素的值+10
printf("%d\n",*(*(p+0)+3));//*(p+0)+3->&a[0][0]+3,超出本行,自动跳入下行:a[1][0];
}
//动态内存分配
//例:从控制台接收不定个数的数字,然后翻转
void func7(){
int n=0;
printf("你要输入的数字的个数是\n");
scanf("%d",&n);
int *pi;
//void *;//代表任意类型的指针
//将首地址赋值给pi指针
// pi=(int*)malloc(sizeof(int)*n);//申请sizeof(int)*n个字节空间
pi=(int*)calloc(n,sizeof(int));//申请sizeof(int)*n个字节空间,该区域初始化为0
printf("pi=%p\n",pi);
for (int i=0; i<n; i++) {
printf("请输入第%d个数\n",i+1);
scanf("%d",pi+i);//存储到相关元素地址
}
printf("翻转前");
for (int i=0; i<n; i++) {
printf("第%d个位置的元素是%d\n",i,pi[i]);//pi++;X!int类型占4个存储空间,+1出错
}
printf("翻转后\n");
for (int i=0; i<n/2; i++) {
int t=*(pi+i);
*(pi+i)=*(pi+n-1-i);
*(pi+n-1-i)=t;
}
for (int i=0; i<n; i++) {
printf("第%d个位置的元素是%d\n",i,*(pi+i));
}
free(pi);//释放内存
}
//字符串指针
//使用指针实现字符串复制
void func8(){
char *pc1="hello word";
char *pc2=(char*)malloc(sizeof(char)*strlen(pc1)+1);
//将申请的字符空间的地址赋给pc2
Strcpy(pc2, pc1);
printf("%s",pc2);
}
void Strcpy(char *target,char *source){ //字符串复制
int i=0;
while (*(source+i)!=0) {
*(target+i)=*(source+i);
i++;
}
*(target+i)='\0';
}
//使用指针实现字符串内容翻转
void func9(){
char str1[]="hello";
Rev(str1);
printf("%s",str1);
}
int Strlen(char *source){ //计算字符串长度
int i=0;
while (*(source+i)!='\0') {
i++;
}
return i;
}
void Rev(char *source){ //字符串翻转
int n=Strlen(source);
for (int i=0; i<n/2; i++) { //source[0]<->sourcr[n-1].....
char t=*(source+i);
*(source+i)=*(source+n-1-i);
*(source+n-1-i)=t;
}
}
void func10(){
int *p;
p=getAnArraylnFun();
for (int i=0; i<5; i++) {
printf("%d\n",*(p+i));
}
}
int *getAnArraylnFun(){
static int array[5]={1,2,3,4,5};
//.....
return array;
}
随堂笔记为个人学习笔记,若有错误,望指出,谢谢!!