关于指针的一点点理解

关于指针的一点点理解

#include<iostream>
int main()
{
  using namespace std;
  int *p;
  *p=10;
  cout<<*p;
}

在我的理解里,第一句的int * p是创造了一个指针变量,他的地址是p。这里的“ * ”不是运算符,而是一种定义的标志,即有这个符号就是定义了一个指针变量。 所以如果int * p=10的话,编译器就会报错,因为编译器不认为你是要去用10这个地址。
而随后的 * p=10,“ * ”是解引用的意思,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中保存的值。所以*p就是一个具有地址的int变量,这就是指针变量。

#include<iostream>
using namespace std;
char * buildstr(char c,int n);
//返回字符串的地址,这样做效率更高,函数无法直接返回一个字符串 ,所以定义的为char* 
int main()
{
	int times;
	char ch;
	cout<<"Enter a character: ";
	cin>>ch;
	cout<<"Enter an integer: ";
	cin>>times;
	char *ps=buildstr(ch,times);
	cout<<ps<<endl;
	delete []ps;
	ps=buildstr('+',20);
	cout<<ps<<"-DONE-"<<ps<<endl;
	delete []ps;//释放所有内存
	//delete ps 只会释放ps[0] 这一点内存,造成内存泄露 
	return 0;
}

char * buildstr(char c,int n)
{
	char *pstr =new char[n+1];//需要能够存储n+1个字符的空间,以便能够存储空值字符 
	pstr[n]='\0';// 存储空值字符 
	while(n-->0)
	{
		pstr[n]=c;
	}
	return pstr;//返回字符串的地址,这样做效率更高,函数无法直接返回一个字符串
	
}

来看看这个源代码叭!这是一个输出指定次数的特定字母的简单程序,即输入a 6,就会输出aaaaaa(有点骚哦),但是这个程序的特点在于它返回字符串的地址!返回了地址,char * ps=buildstr(ch,times);这里的右边是地址!!!这也映证了我第一段说的,定义指针变量时,* p是地址!!!注意为什么随后的语句,cout<<ps<<endl;,为什么输出ps???不输出* ps??照上面说的,他妈的ps是地址啊, * ps才是值啊???注意注意!!ps是字符串的地址!也就是说,ps是数组啦!数组的第一个值,是ps,想要输出所有的数组值,肯定要ps而非*ps了。(*ps=ps[ ])但是实际中还是要定义指针变量,因为指针变量才有地址。也就是说,char ps[]=buildstr(ch,times)是错误的。事实上,数组就是一种指针。
我们来通过代码证明上述。现在我修改代码为cout<<ps[4]<<endl;然后我cin>>time的时候,一次cin>>6,可以正常输出a,另一次cin>>2,发现输出为空,那我就知道了,ps就是一个数组,*ps就是数组的第一个值,*ps=ps[0],ps指向整个数组。

发布了24 篇原创文章 · 获赞 1 · 访问量 1677

猜你喜欢

转载自blog.csdn.net/lllsy_12138/article/details/88881443