变量地址--起始地址
指针和地址等价
指针变量存储地址-----------int *i_pointer; 实现间接访问
int main(){
int i =5;
int *i_pointer=&i ; //定义了一个指针变量
//指针变量的初始化,某个变量取地址来赋值,不能随机写个数
printf(_Format:"i=%d\n",i);//直接访问
printf(_Format:"*i_pointer=%d\n",*i_pointer);//间接访问
return 0;
}
取地址运算符(引用)&。 取值操作符 *。 单目运算符 右至左
&*i_pointer=i_pointer. *&a=a
int a ,b,c. int *a,b,c =int* a,b,c. int *a,*b,*c
---------------------------------------------------------
指针的传递使用场景 --传递和偏移
void change(int j){
j=5;
}
int main(){
int i =10;
printf(_Format:"before change i=%d\n",i);
change(i);//c语言函数调用是值传递,实参赋值给形参,j=1
printf(_Format:"after change i=%d\n",i);
return 0;
}
---------------------------------------------------
void change(int *j){
*j=5;
}
int main(){
int i =10;
printf(_Format:"before change i=%d\n",i);
change(&i);//c语言函数调用是值传递,实参赋值给形参,j=&i
printf(_Format:"after change i=%d\n",i)
}
---------------------------------
指针的偏移使用场景---对指针进行加或减
#define N 5
int main(){
int a[N]={1,2,3,4,5};//数组名内存储了数组的起始地址,a中存储的就是一个地址值
int *p;
p=a;
int i;
for(i=0;i<N;i++){
printf(_Format:"%3d",*(p+1));//与a[i]等价
}
p=&a[4];
for (i=0;i<N;i++){
printf("%3d",*(p-i));
}
}
--------------------------------
指针与一维数组
数组名作为实参传递给子函数时,是弱化为指针的
void change(char *d) {
*d='H';
d[1]='E'; //*(d+1)='E'
*(d+2)='L';
}
int main(){
char c[10]="hello";
change(c);
puts(c);
return0;
-----------------------------------------------
指针与malloc 动态内存申请
堆和栈的差异 堆空间在整个进程中一直有效,不因为函数调用结束而释放
int main(){
int size; void类型指针不能偏移,因此不会定义无类型指针
char *p; //
scanf("%d",&size); //输入申请空间大小
//malloc返回的void * 代表无类型指针
p=(char*)malloc(size);
strcpy(p,"malloc success");
puts(p);
free(p);
printf("free success\n");
return0;
}
-----------
char *print_stack(){
char c[100]="i'm print_stack func";
puts(c);
return c;
} //栈空前由操作系统管理
char *print_malloc(){
char *p=(char *)malloc(100);
strcpy(p,"i'm print malloc func")
puts(p);
}//堆空间在整个进程中一直有效,不因为函数调用结束而消亡
int main(){
char *p;
p=print_stack();
puts(p);
p=print_malloc();
puts(p);
free(p);释放堆空间
return 0;
}