遍历指针数组的值:
int a=1;
int b=2;
int c=3;
int *arr[3]={&a,&b,&c};
for (int i=0;i<3;i++)
{
printf("%d\n",*(arr[i]));
打印每一个元素:
printf("%p\n",arr[i]);
用指针取最大值:
int tempMax=*(arr[0]);
for(int i=0;i<3;i++)
{
if (tempMax<*(arr[i])
{
tempMax=*(arr[i]);
}
}
printf("%d\n",tempMax);
在控制台上输入整数,创建一个长度为3的数组:
int a=3;
int intArr[3];
for(int i=0;i<3;i++)
{
scanf("%d",&a);
intArr[i]=a;
}
指针也可以有指针名[移动数量],c[1]等效于*(c+1)
指针名[移动数量],并且以这个指针开始的位置为基准
数组当参数运算实际传递的是数组首元素的地址
如果:
int a=0;
int b=1;
int *p=&a;
printf(‘"%d---%d\n",*p,p[1]); p[-1]等效于*(p-1)
这时输出的p[1]的值为1,因为变量定义时内存寻址是由下往上,由大到小
指针与二维数组
1.二维指针数组是一个数组,里面的每一个子数组存得元素的类型是指针
2.二维数组的指针是一个指针,只是指针类型是二维数组
例如:int arr[2][3]={{1,2,3},{4,5,6}} 这是一个二维数组
int (*p)[2][3]=&arr;就是一个二维数组的指针
指针与函数
1.概念:是函数,这个函数的返回值类型是指针
2.定义:类型 * 函数名(参数){return 指针类型}
如:int *add(int *a){return &a;}表示定义一个返回值是int指针类型的add函数
3.什么是函数指针?
是指针,函数也会在内存开辟一块空间,函数指针即这块空间的地址
定义:函数返回值类型(*指针名)(参数类型);
赋值:指针名+函数名;
如:先定义函数 int add(int a){...},int(*p)(int)=add;
使用:指针名(实参); 如:p(3);等效于add(3);
4.特点:①函数指针可以做加减运算,但没有意义,不建议
②函数指针可以当做参数传递,因为其是一个指针类型
③不管什么类型的指针,只要是指针,其里面存得就是地址
什么时候需要定义一个指针型函数?
需要返回一个指针时
什么时候需要定义一个函数的指针?
需要把这个函数当做参数去传递的时候
指针与字符串
1.怎么表示一个字符串?
char arr[]="heima" ; char arr[]={'h','e','i','m','a'}; //用字符数组创建的是变量
2.怎么用指针表示一个字符串?
char *p="heima";//用指针创建的是变量
指针定义字符串的时候,存的是常量区字符串的首元素地址
3.怎么表示一个字符串数组?
char *arrs[2][8]={"itcast","heima"};
4.怎么用指针表示一个字符串数组?
chars[2]={"itcast","heima"};
特点:①指针定义的字符串是常量,不能被改变,而字符数组定义的是变量,可以被改变
②指针定义一个字符串,指针存的是实际是在常量区的那个字符串的首字符的地址
内存的分区:
堆区:堆区存储用户手动申请的内存数据,如果用户不释放会一直存在,容易内存泄漏
栈区:是我们在定义变量的时候,系统自动给我们分配的内存空间,一旦变量在作用域内执行完毕,会
立即销毁,系统自动回收
静态区:全局变量
常量区:常量--字符串常量,指针方式定义的字符串。不是所有的常量都在常量区
代码区:主要放函数的二进制代码
常量区的常量与变量区别
①常量区的常量只有一份,也就是重用的时候,用的都是同一个,地址一样
②而变量同一个字符串,不同的变量地址不同
|
|