这里的执行是错的,赋值也是错的,因为它是不可知的表示,只存在,它们是指针变量,可以用来存储变量地址。
1.数组认知:a .空间的静态分配(int a[100];分配400字节)且空间利用率差(不够用或浪费空间)
Malloc realloc是在不使用的时候动态分配释放的,具有效率高,空间使用效率高,开销相对较大的优点。)b .占用内存空间的特点:连续(物理连续)Malloc分配的空间是物理连续的吗?(malloc实现原理:链表将所有空闲空间链接起来,形成最终分配的空间)2。如何使用数组:a .定义数组:数组应该定义多大?char src[1024];——最佳方案:灵活数组注:变长数组c99:定义一个变量,可以用来替换已定义数组的长度(在使用中不能修改变量的值来扩展数组的内存空间)
int n;int a[n];局部变量——存储在堆栈空间——未初始化的变量自动赋以随机值;当定义一个数组时,你必须确定它的长度;宏通常用来表示数组的大小,以提高代码的可移植性。
B.数组的用途:数组名的作用:(数组名:指针常量,存放数组第一个元素的地址。输入时不需要带地址符号(a+i),output *(a+i)函数体中定义的数组会降级指针:
printf("&a[0] = %p/n ",& a[0]);//数组第一个元素的地址printf(" a = % p/n ",a);//数组第一个元素的地址printf(" & a = % p/n ",& a);//&a:数组的地址*(& a)= a;一维数组的地址值等于数组第一个元素的地址。二维数组:定义:行不能省略,列可以省略。二维数组名:指针常量(一维数组指针)。保存第一个一维数组的地址。三维数组:Intaaa [2] [2] [2] = {1,2,3,4},{5,6,7,7}
# include # include int main(){ char str[100];char ktr[2][100];char ptr[2][2][100];printf("请输入字符串:/n ");scanf("%s ",str);printf("str = %s/n ",str);printf("请输入ktr:/n ");for(int I = 0;i printf("ktr[%d] = %s/n ",I,*(ktr+I));//ktr[I];} for(int I = 0;i scanf("%s ",*(*(ptr+I)+j));//ptr[I][j]} } for(int I = 0;i printf("ptr = %s/n ",*(*(ptr+I)+j));//ptr[i][j] } }返回0;}数组指针变量:数组存储的地址。2D数组指针变量:int(* PAA)[2][2]= & aa;指向一个二维数组(保存二维数组的地址)。数组指针使用的场景:(函数参数:定义函数)
# include void print 1(char * str){ printf(" str = % s/n ",str);} void print 2(char(* ktr)[100]){ for(int I = 0;I for(int I = 0;i printf("ptr = %s/n ",*(*(ptr+I)+j));//ptr[i][j] } }}int main(int argc,char * argv[]){ char str[100];//" hello 1 " char ktr[2][100];//" hello 1 " " hello 2 " char ptr[2][2][100];//" hello 3 " " hello 4 " " hello 5 " " hello 6 ";printf("请输入字符串:/n ");scanf("%s ",str);//第一个元素地址print 1(str);// printf("请输入ktr:/n ");for(int I = 0;i // printf("ktr[%d] = %s/n ",I,*(ktr+I));//ktr[I];//} for(int I = 0;i scanf("%s ",*(*(ptr+I)+j));//ptr[I][j]} } print 3(ptr);//for(int I = 0;I < 2;i++)//{//for(int j = 0;j < 2;j++) // { // printf("ptr = %s/n ",*(*(ptr+I)+j));//ptr[i][j] // } // }返回0;}指针数组:
int * pi[3];//int(* pa)[3];注意:局部指针数组中的元素都是通配符指针数组和指针之间的区别:
数组指针(也叫行指针)定义int(* p)[n];()具有高优先级。首先说明P是一个一维整数数组的指针。这个一维数组的长度是N,也可以说是P的步长,也就是说当执行p+1时,P要跨越N个整数数据的长度。
如果要给一个指针赋一个二维数组,应该这样赋值:int a[3][4];int(* p)[4];//这个语句是定义一个数组指针,指向一个有4个元素的一维数组。p = a;//将这个二维数组的第一个地址赋给P,即a[0]或& a[0][0]p++;//语句执行后,即p = p+1;p穿过直线a[0][],指向直线a[1][]
所以数组指针也叫一维数组指针,也叫行指针。
数组定义int p[n];[]具有高优先级。先和p组合成一个数组,然后用int解释这是一个整数指针数组,有n个指针类型的数组元素。这里执行p+1是错误的,所以赋值也是错误的:P = A;因为P是未知表示,所以只有p[0],p[1],p[2]…p[n-1],而且是指针变量,可以用来存储变量地址。但是可以这样,p = a;这里p代表指针数组的第一个元素的值,a的第一个地址的值,如果要给指针数组赋一个二维数组:int * p[3];int a[3][4];for(I = 0;我[]>*
1.用递归的方法实现一个函数,可以实现n的阶乘,也就是n!= n(n-1)…321;*
# include # include int fun(int num){ int s = 1;if(num = = 1){ return 1;} else if(num > 1){ s = num *(fun(num -1));返回s;} else { printf("输入错误/n ");出口(1);}}int main(){ int n,resultprintf("请输入mnuber/n ");scanf("%d ",& n);结果=乐趣(n);printf("result=%d/n ",结果);返回0;} 2.使用递归函数调用,以逆序打印出输入的N个字符。
#include //使用递归函数调用打印出逆序输入的五个字符。void fun(int i,char *p){ if (i == 0) { printf("%c ",p[I]);返回;} else { printf("%c ",p[I]);好玩(i - 1,p);} } int main(){ char str[6];printf(" input char:/n ");fgets(str,6,stdin);fun(4,str);printf("/n ");}
评论前必须登录!
注册