【C语言】指针进阶(二)-创新互联
这里写目录标题
本文名称:【C语言】指针进阶(二)-创新互联
标题来源:http://scgulin.cn/article/doooje.html
- 一级目录
- 整型数组
- 字符数组
- 字符串长度
- 指针和数组面试题
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
sizeof(数组名)——计算整个数组的大小
&数组名——取出整个数组的地址
除此之外,所有的数组名都是数组首元素的地址
int main() {int a[] = {1,2,3,4 };
printf("%d\n", sizeof(a)); //4*4=16
printf("%d\n", sizeof(a + 0)); //a+0是第一个元素的地址,计算地址的大小
printf("%d\n", sizeof(*a)); //*a是数组的第一个元素,计算第一个元素(整型)的大小
printf("%d\n", sizeof(a + 1)); //a+1是第二个元素的地址,计算地址的大小
printf("%d\n", sizeof(a[1])); //计算第二个元素(整型)的大小
printf("%d\n", sizeof(&a)); //计算一个地址的大小
printf("%d\n", sizeof(*&a)); //取地址再解引用,计算数组的大小
printf("%d\n", sizeof(&a + 1)); //数组后面的空间的地址的大小
printf("%d\n", sizeof(&a[0])); //第一个元素地址的大小
printf("%d\n", sizeof(&a[0] + 1)); //第二个元素地址的大小
return 0;
}
字符数组char arr[] = {'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr)); //数组大小
printf("%d\n", sizeof(arr + 0)); //第一个元素地址的大小
printf("%d\n", sizeof(*arr)); //第一个元素(字符)的大小
printf("%d\n", sizeof(arr[1])); //第二个元素(字符)的大小
printf("%d\n", sizeof(&arr)); //地址的大小
printf("%d\n", sizeof(&arr + 1)); //数组后面的空间的地址的大小
printf("%d\n", sizeof(&arr[0] + 1));//第二个元素地址的大小
字符串长度char arr[] = {'a','b','c','d','e','f' };
printf("%d\n", strlen(arr)); //找'\0',随机值
printf("%d\n", strlen(arr + 0)); //随机值
printf("%d\n", strlen(*arr)); //把a(97)当作地址解引用,出错
printf("%d\n", strlen(arr[1])); //把b(98)当作地址,出错
printf("%d\n", strlen(&arr)); //随机值
printf("%d\n", strlen(&arr + 1)); //数组后面的空间找'\0',随机值-6
printf("%d\n", strlen(&arr[0] + 1));//第二个元素开始找'\0',随机值-1
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //数组大小,7
printf("%d\n", sizeof(arr + 0)); //第一个元素地址的大小
printf("%d\n", sizeof(*arr)); //第一个元素(字符)的大小
printf("%d\n", sizeof(arr[1])); //第二个元素(字符)的大小
printf("%d\n", sizeof(&arr)); //地址的大小
printf("%d\n", sizeof(&arr + 1)); //数组后面的空间的地址的大小
printf("%d\n", sizeof(&arr[0] + 1));//第二个元素地址的大小
char arr[] = "abcdef";
printf("%d\n", strlen(arr)); //数组长度,6
printf("%d\n", strlen(arr + 0)); //同上
printf("%d\n", strlen(*arr)); //把a(97)当作地址解引用,出错
printf("%d\n", strlen(arr[1])); //把b(98)当作地址,出错
printf("%d\n", strlen(&arr)); //6
printf("%d\n", strlen(&arr + 1)); //数组后面的空间找'\0',随机值
printf("%d\n", strlen(&arr[0] + 1));//第二个元素开始找'\0',5
char* p = "abcdef";
printf("%d\n", sizeof(p)); //指针变量大小
printf("%d\n", sizeof(p + 1)); //第二个元素指针变量的大小
printf("%d\n", sizeof(*p)); //第一个元素(字符)的大小
printf("%d\n", sizeof(p[0])); //第一个元素(字符)的大小
printf("%d\n", sizeof(&p)); //地址的大小
printf("%d\n", sizeof(&p + 1)); //地址的大小
printf("%d\n", sizeof(&p[0] + 1));//第二个元素地址的大小
char* p = "abcdef";
printf("%d\n", strlen(p)); //数组长度,6
printf("%d\n", strlen(p + 1)); //5
printf("%d\n", strlen(*p)); //第一个元素(ASCII码),出错
printf("%d\n", strlen(p[0])); //同上
printf("%d\n", strlen(&p)); //从p的位置开始找'\0',随机值
printf("%d\n", strlen(&p + 1)); //从p的位置加4(或8)开始找'\0',随机值
printf("%d\n", strlen(&p[0] + 1));//5
//二维数组
int a[3][4] = {0 };
printf("%d\n", sizeof(a)); //3*4*sizeof(int)=48
printf("%d\n", sizeof(a[0][0])); //第一行第一个元素的地址,4
printf("%d\n", sizeof(a[0])); //a[0]表示整个第一行,计算第一行的大小4*sizeof(int)=16
printf("%d\n", sizeof(a[0] + 1)); //a[0]表示第一行第一个元素的地址,a[0]+1表示第二个元素的地址,计算地址的大小
printf("%d\n", sizeof(*(a[0] + 1))); //计算第一行第二个元素(整型)的大小
printf("%d\n", sizeof(a + 1)); //a是二维数组的数组名,表示二维数组首元素的地址,即第一行的地址,a+1表示第二行地址的大小
printf("%d\n", sizeof(*(a + 1))); //取地址再解引用,计算第二行的大小
printf("%d\n", sizeof(&a[0] + 1)); //第二行的地址的大小
printf("%d\n", sizeof(*(&a[0] + 1))); //第二行的大小
printf("%d\n", sizeof(*a)); //第一行的大小
printf("%d\n", sizeof(a[3])); //一行的大小,sizeof()内部是不计算的,只根据类型计算大小
指针和数组面试题int main() {char str1[] = "hello";
char str2[] = "hello";
char* str3 = "hello";
char* str4 = "hello";
if (str1 == str2) {printf("str1 and str2 are same.\n");
}
if (str3 == str4) {printf("str3 and str4 are same.\n");
}
return 0;
}
str1[]和str2[]是两个数组,str1和str2代表数组首元素地址,比较的是两个不同的地址
str3和str4是两个指针变量,里面写入了常量字符串,比较的是两个相同的地址
char* ps="hello";
* ps='w';
2会报错,因为常量字符串的内容不能修改
int main() {int a[5] = {1,2,3,4,5 };
int* ptr = (int*)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
//a+1表示第二个元素地址,解引用为第二个元素
//*ptr表示数组之后空间,*(ptr-1)向前移一个整型,表示数组最后一个元素
return 0;
}
3struct Test {int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p; //假设p的值为0x100000,结构体Test类型的变量大小是20字节
int main() {printf("%p\n", p + 0x1); //指针+1,跳过20字节,即0x14
printf("%p\n", (unsigned long)p + 0x1); //整型+1
printf("%p\n", (unsigned int*)p + 0x1); //+1整型,即+4
return 0;
}
4指针类型决定了指针的运算
int main() {int a[4] = {1,2,3,4 };
int* ptr1 = (int*)(&a + 1); //数组后面空间
int* ptr2 = (int*)((int)a + 1); //地址差1,实际偏移一个字节,再整形指针解引用
printf("%x ", ptr1[-1]); //*(ptr1-1)
printf("%x", *ptr2); //如果是小端存储则为(01) 00 00 00 02
return 0;
}
5int main() {int a[3][2] = {(0,1),(2,3),(4,5) }; //逗号表达式,(1,3,5,0,0,0)
int* p;
p = a[0];
printf("%d", p[0]); //1
return 0;
}
6int main() {int a[5][5]; //5行5列
int(*p)[4]; //p指向一个地址
p = a;
printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//p指向a,p+1指向a+4,p+2指向a+8...
//p[4][2]指向a+19
//指针-指针=两个指针之间元素个数,-4
//10000000 00000000 00000000 00000100
//11111111 11111111 11111111 11111011
//11111111 11111111 11111111 11111100即FFFFFFFC
return 0;
}
7int main() {int a[2][5] = {1,2,3,4,5,6,7,8,9,10 };
int* ptr1 = (int*)(&a + 1); //数组后面空间
int* ptr2 = (int*)(*(a + 1)); //第一行后面空间
printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1)); //10,5
return 0;
}
8int main() {char* a[] = {"work","at","ali" };
char** pa = a;
pa++;
printf("%s\n", *pa); //at
return 0;
}
9int main() {char* c[] = {"enter","new","point","first" };
char** cp[] = {c + 3,c + 2,c + 1,c }; //交叉指向c
char*** cpp = cp; //cpp放cp地址
printf("%s\n", **++cpp); //cp中c+2→point
printf("%s\n", *-- * ++cpp + 3); //cp中c+1,进行--得到c→enter,进行+3打印e之后的内容er
printf("%s\n", *cpp[-2] + 3); //**(cpp-2)得到c+3→first,进行+3打印s之后的内容st
printf("%s\n", cpp[-1][-1] + 1); //*(cpp-1)得到c+2,*(*(cpp-1)-1)得到new的地址,进行+1后打印n之后的内容ew
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文名称:【C语言】指针进阶(二)-创新互联
标题来源:http://scgulin.cn/article/doooje.html