int *pt;
int arr[]={1,2,3};
pt = &arr; //Incompatible pointer types assigning to "int *" from "int (*)[3]"int main(){
int arr[10][5]={1,2,3,4,5;
printf("arr=%p,\t arr[0]+1=%p,\t arr+1=%p,\t aar[1]=%p \n",arr, arr[0]+1, arr+1, arr[1]);
return 0;
}int arr[]={1,2,3};
int *pt=arr;
printf("pt[2]= %d\t *(pt+2)= %d\n",pt[2],*(pt+2)); //They are equivalentint fun1(int a[][3],int n);
int fun2(int (*a)[3],int n);
int fun3(int a[2][3],int n);
// They are equivalentint arr[]={1,2,3};
int *pt=arr;
pt++; // Legal
arr++;// Illegal
printf("%d,\n", *(pt+1)) // allowed
printf("%d,\n", *(arr+1)) // allowedint main(){
int arr[5]={1,2,3,4,5};
int *pt=arr;
printf("pt=%p,\t&pt=%p,\n",pt,&pt);
printf("arr=%p,\t&arr=%p,\n",arr,&arr);
getchar();
return 0;
}void add(int *a, int *b){
int *pt;
*pt=*a;
*b+=*pt;
}
int main(){
int a=0,b=2;
add(&a,&b);
return 0;
}void swap(int *a, int *b){
int *pt=a;
a = b;
b = pt;
}
int main(){
int a=0,b=2;
swap(&a,&b);
printf("a=%d,\t b=%d",a,b);
return 0;
}| symbol | address | type |
|---|---|---|
| a | 0x2220 | int |
| … | … | … |
| symbol | address | type |
|---|---|---|
| a | 0x2220 | int |
| pt | 0x2224 | int |
| … | … | … |
| symbol | address | type |
|---|---|---|
| a | 0x2220 | int |
| pt | 0x2224 | int |
| arr | 0x2228 | int |
| … | … | … |
| symbol | address | type |
|---|---|---|
| a | 0x2220 | int |
| pt | 0x2224 | int |
| arr | 0x2228 | int |
| pt | 0x222C | int * |
| … | … | … |
int main() {
int arr[5]={1,2,3,4,5};
int (* pt1)[5];
int (* pt2)[5];
int *pt3[5];
pt1 = &arr;
pt2 = arr; //Incompatible pointer types assigning to "int (*)[5]" from "int (*)[2][5]"
pt3[0] = arr;
printf("arr = %p \t &arr=%p \t arr[0]=%p \t arr[1]=%p\n",arr, &arr, arr[0], arr[1]);
printf("pt1=%p\t pt2=%p \t pt3[0]=%p\n",pt1,pt2,pt3[0]);
printf("pt1+1=%p\t pt2+1=%p \n",pt1+1,pt2+1);
printf("*pt1+1=%p\t *pt2+1=%p \t pt3[0]+1=%p\n",*pt1+1,*pt2+1,pt3[0]+1);
printf("*(*pt1+1)=%d\t *(*pt2+1)=%d \t *(pt3[0]+1)=%d\n",*(*pt1+1),*(*pt2+1),*(pt3[0]+1));
getchar();
return 0;
}int main() {
int arr[2][5]={1,2,3,4,5};
int (* pt1)[5];
int (* pt2)[5];
int *pt3[5];
pt1 = &arr; //Incompatible pointer types assigning to "int (*)[5]" from "int (*)[2][5]"
pt2 = arr;
pt3[0] = arr[0];
printf("arr = %p \t &arr=%p \t arr[0]=%p \t arr[1]=%p\n",arr, &arr, arr[0], arr[1]);
printf("pt1=%p\t pt2=%p \t pt3[0]=%p\n",pt1,pt2,pt3[0]);
printf("pt1+1=%p\t pt2+1=%p \n",pt1+1,pt2+1);
printf("*pt1+1=%p\t *pt2+1=%p \t pt3[0]+1=%p\n",*pt1+1,*pt2+1,pt3[0]+1);
printf("*(*pt1+1)=%d\t *(*pt2+1)=%d \t *(pt3[0]+1)=%d\n",*(*pt1+1),*(*pt2+1),*(pt3[0]+1));
getchar();
return 0;
}int main(){
int a=1;
int arr[2][5]={1,2,3,4,5};
int (*pt)[5];
pt = arr;
printf("pt=%p,\t*pt=%p,\tpt[0]=%p\n",pt,*pt,pt[0]);
printf("&arr=%p,\t arr=%p,\t arr[0]=%p \n\n",&arr,arr,arr[0]);
printf("pt+1=%p,\t*pt+1=%p,\tpt[1]=%p\n",pt+1,*pt+1,pt[1]);
pt = arr+1;
printf("pt=%p,\t*pt=%p,\tpt[0]=%p\n",pt,*pt,pt[0]);
printf("&arr+1=%p,\t arr+1=%p,\t arr[1]=%p \n",&arr+1,arr+1,arr[1]);
return 0;
}Exercise 2
double add(int x[], double y){
double z;
z = x[0] + y;
x[0] += 1;
y += 1;
printf("&x[0] is %p\t, x[0]=%d\t, &z = %p\t, y=%f\t, &y=%p\n", x, x[0], &z,y,&y);
return z;
}
int main(){
int a[10] = { 1 };
double b1=2,z;
printf("&add is %p\n", add);
printf("before call: &a[0] is %p\t, a[0]=%d\t, &z = %p\t, b1=%f\t, &b1=%p \n", a, a[0], &z, b1,&b1);
add(a, b1);
printf("after call: &a[0] is %p\t, a[0]=%d\t, &z = %p\t, b1=%f\n", a, a[0], &z, b1);
getchar();
return 0;
}#include <stdio.h>
int main() {
int i=1,j=2;
int *pt1=&i, *pt2=&j;
printf("pt1=%p,\t pt2=%p,\t *pt1=%d,\t *pt2=%d\n",pt1,pt2,*pt1,*pt2);
char c1='1',c2='2';
char *p1=&c1,*p2=&c2;
printf("p1=%p,\t p2=%p,\t *p1=%c,\t *p2=%c\n",p1,p2,*p1,*p2);
pt1=(char*)p1; pt2=(char*)p2;
printf("pt1=%p,\t pt2=%p,\t *pt1=%d,\t *pt2=%d\n",pt1,pt2,*pt1,*pt2);
return 0;
}void fun(int *pt, int val){
*pt=1;
val=2;
printf("*pt=%d,\tpt=%p,\tval=%d,\t&val=%p\n",*pt,pt,val,&val);
}
int main(){
int a=0,b=2;
int *pt1=&a;
printf("pt1=%p,\t&pt1=%p,\t*pt1=%d\n",pt1,&pt1,*pt1);
printf("a=%d,\t&a=%p\n",a,&a);
printf("b=%d,\t&b=%p\n",b,&b);
fun(&a,b);
printf("pt1=%p,\t&pt1=%p,\t*pt1=%d\n",pt1,&pt1,*pt1);
printf("a=%d,\t&a=%p\n",a,&a);
printf("b=%d,\t&b=%p\n",b,&b);
return 0;
}