该编文章是收集网络上有关指针题目并对其进行整理,其目的是加深对指针的理解,使自己对指针理解更加透彻。文章以讲解题目为主同时在原有题目基础上进行拓展。
一些理解不正确的地方,希望各位指正! 谢谢
文章为原创,转载请注明出处,谢谢 ;
作者 : 飞哥
1.请说明以下定义指针之间的区别:
char const * p1;
char * const p2;
char const * const p3;
const char * const p4;
1) p1 称之为: 常量指针,就是指向常量的指针,该指针的目标不可被修改,但是指针本身可以被修改。
例如:
int n = 100;
const int* p = &n; // int const* p;
*p = 200; // error !
int m = 1000;
p = &m;
(*p)++; // error !
2) p2 称之为 : 指针常量就是指针类型的常量,该指针本身不能被修改,但是指针的目标可以被修改。
例如:
int n = 100;
int* const p = &n;
*p = 200; // ok !
int m = 1000;
p = &m; // error !
3)p3和p4指针是意义是相同的,称之为: 常量指针常量,指针本身和它的目标都是常量,都不可被修改。
这两个指针比较好理解,我再次不再赘述;
例如:
int n = 100, m = 1000;
const int* const p = &n;
*p = 200; // error !
p = &m; // error !
结论: 1.常量指针,是常量不可以被修改,或者说指向不改变;
2.指针常量,是指针本身不能被修改;或者说指向可以改变;
为避免混淆,您可以这样理解:
口头提问时 : 常量指针和指针常量区别: "指针"开头表示指针本身不能被修改,"常量"开头表示指向的内容不能被修改;
自己理解时 : " * " 后有const表示指针不能被改变; “ * ” 前有const表示指针指向的目标不能被改变;
2.指针和引用区别
3.请说明下面输出结果
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
结果是:0 0 1 1
str1,str2,str3,str4是数组变量,它们有各自的内存空间;
而str5,str6,str7,str8是指针,它们指向相同的常量区域。
4.下面输出数组大小的函数有没有问题?
int Strlen(char str[])
{
return (int)(sizeof(str)-1);
}
有问题,函数 strlen(char str[])与strlen(char* pStr)写法的含义相同,在形参与实参结合过程中,
5.说说下面两者的区别:
char a[] =“abcdefg”;
那么,p[i]与a[i]的区别?
p[i]是先获取符号表p地址的内容,然后在该内容上+i地址处获取内容,即为间接引用。这里的“间接”指的是要被操作的地址不能直接从编译器符号表 中直接获得,而是从指针对象中获得。
int *ptr=(int *)(&a+1);
printf("%d,%d/n",*(a+1),*(ptr-1));
输出结果是什么?
void get_memory(char *p)
{
p = (char *)malloc(sizeof(char) * 100);
}
void test(void)
{
char *str = NULL;
get_memory(str);
strcpy(str, "hello world");
printf("%s\n", str);
}
答案: 段错误